代码
#include <algorithm>
#include <cstdio>
//C++写法 左闭右开区间
class PersistentSegmentTree {
public:
struct PersistentSegmentTreeNode {
int L, R;
int Sum;
};
PersistentSegmentTreeNode Tree[6400005] { };
int Cnt = 1;
int Update(int Prev, int L, int R, int Id) {
int This = Cnt++;
Tree[This].L = Tree[Prev].L;
Tree[This].R = Tree[Prev].R;
Tree[This].Sum = Tree[Prev].Sum + 1;
int Mid = (L + R) / 2;
if (R - L > 1) {
if (Id < Mid) {
Tree[This].L = Update(Tree[Prev].L, L, Mid, Id);
} else {
Tree[This].R = Update(Tree[Prev].R, Mid, R, Id);
}
}
return This;
}
int Query(int L01, int R01, int L02, int R02, int Num) {
//[L01, R01]
if (R02 - L02 == 1) return L02;
int X = Tree[Tree[R01].L].Sum - Tree[Tree[L01].L].Sum;
int Mid = (L02 + R02) / 2;
if (X > Num) {
return Query(Tree[L01].L, Tree[R01].L, L02, Mid, Num);
} else {
return Query(Tree[L01].R, Tree[R01].R, Mid, R02, Num);
}
}
} SegmentTree;
int Initialization(int *ArrL, int *TmpL, int *TmpR, int *RootL) {
for (int *i = ArrL, *j = TmpL; i < TmpR; i++, j++) {
*j = *i;
}
std::sort(TmpL, TmpR);
int Size = int(std::unique(TmpL, TmpR) - TmpL);
for (int *i = TmpL, j = 0; i < TmpR; i++, j++) {
int X = int(std::lower_bound(TmpL, TmpR, *(ArrL + j)) - ArrL);
*(RootL + X) = SegmentTree.Update(*(RootL + X - 1), 1, Size, X);
}
return Size;
}
int N, M, Arr[200005], Tmp[200005], Root[200005];
int main( ) {
std::scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++) {
std::scanf("%d", &Arr[i]);
}
int Size = Initialization(Arr, Tmp, Tmp + N, Root);
for (int i = 0; i < M; i++) {
int L, R, Num;
std::scanf("%d%d%d", &L, &R, &Num);
L--;
R--;
if (L != 0) {
std::printf("%d\n", Tmp[SegmentTree.Query(Root[L - 1], Root[R], 0, Size, Num)]);
} else {
std::printf("%d\n", Tmp[SegmentTree.Query(Root[200004], Root[R], 0, Size, Num)]);
}
}
return 0;
}
本地可以return 0,WA,洛谷离奇CE,Linux(本地)core dumped,不知道有什么问题