rt,尝试用 vector 建树,但是发生了神奇错误,初步判断是 update 函数的问题,但是没找到哪里错了,求大佬看看
#include<bits/stdc++.h>
#define MAXN 200010
using namespace std;
struct node{
int l, r;
int lson, rson;
int res;
};
vector<node> tree;
int n, m, q, tot;
int a[MAXN], disc[MAXN], root[MAXN];
void push_up(int now){
tree[now].res = tree[tree[now].lson].res + tree[tree[now].rson].res;
}
void build(int &now, int l, int r){
now = ++tot;
// tree[now] = (node){l, r, 0, 0, 0};
tree.push_back((node){l, r, 0, 0, 0});
// now = tree.size() - 1;
if(l == r) return ;
int mid = (l + r) >> 1;
build(tree[now].lson, l, mid); build(tree[now].rson, mid + 1, r);
push_up(now);
}
int update(int now, int x, int k){
// tree[++tot] = tree[now];
tree.push_back(tree[now]);
tot++;
// tree[++tot] = tree[now];
// printf("%d %d\n",tot,tree.size());
if(tree[now].l == tree[now].r){
tree[tot].res += k;
return tot;
}
int mid = tree[tree[now].lson].r, cur = tot;
if(x <= mid) tree[cur].lson = update(tree[now].lson, x, k);
else tree[cur].rson = update(tree[now].rson, x, k);
push_up(cur);
return cur;
}
int query(int p1, int p2, int k){
if(tree[p1].l == tree[p1].r) return tree[p2].l;
int x = tree[tree[p2].lson].res - tree[tree[p1].lson].res;
// printf("[%d, %d], %d\n",tree[p1].l,tree[p2].r,x);
if(k <= x) return query(tree[p1].lson, tree[p2].lson, k);
else return query(tree[p1].rson, tree[p2].rson, k - x);
}
int main(){
// freopen("test.out", "w", stdout);
scanf("%d%d",&n,&q);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]), disc[i] = a[i];
sort(disc + 1, disc + n + 1);
m = unique(disc + 1, disc + n + 1) - disc - 1;
for(int i = 1; i <= n; i++) a[i] = lower_bound(disc + 1, disc + m + 1, a[i]) - disc;
tree.push_back((node){0, 0, 0, 0, 0});
build(root[0], 1, m);
for(int i = 1; i <= n; i++) root[i] = update(root[i - 1], a[i], 1);
// for(int i = 1; i <= tot; i++) printf("%d %d %d %d %d\n",tree[i].l, tree[i].r, tree[i].lson, tree[i].rson, tree[i].res);
while(q--){
int l, r, k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",disc[query(root[l - 1], root[r], k)]);
}
return 0;
}