我是 MnZn,只过了前2个点,求大佬指出错误
#include<bits/stdc++.h>
#define fi first
#define se second
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define sum(x) tr[x].sum
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using ull=unsigned long long;
void read(int &x){
char ch=getchar();
int r=0,w=1;
while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch))r=(r<<1)+(r<<3)+(ch^48),ch=getchar();
x=r*w;
}
const int N=2e5+7;
struct node{
int ls,rs,sum;
}tr[N*32];
int a[N],n,T,b[N],t[N],root[N],cnt=1,len;
void init(){
for(int i=1;i<=n;i++)b[i]=a[i];
sort(b+1,b+n+1);
len=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)
t[i]=lower_bound(b+1,b+len+1,a[i])-b;
}
void build(int p,int l,int r){
sum(p)=0;
if(l==r)return;
int mid=l+r>>1;
ls(p)=++cnt;rs(p)=++cnt;
build(ls(p),l,mid);build(rs(p),mid+1,r);
}
void change(int p,int q,int l,int r,int x,int k){
if(l==r){
sum(p)+=k;
return;
}
ls(p)=ls(q);rs(p)=rs(q);
int mid=l+r>>1;
if(x<=mid){
ls(p)=++cnt;
change(ls(p),ls(q),l,mid,x,k);
}
else{
rs(p)=++cnt;
change(rs(p),rs(q),mid+1,r,x,k);
}
sum(p)=sum(ls(p))+sum(rs(p));
}
int query(int p,int q,int l,int r,int k){
if(l==r)return b[l];
int mid=l+r>>1;
int bb=sum(ls(p))-sum(ls(q));
if(bb>=k)return query(ls(p),ls(q),l,mid,k);
else return query(rs(p),rs(q),mid+1,r,k-bb);
}
int main(){
read(n);read(T);
for(int i=1;i<=n;i++)read(a[i]);
init();
build(1,1,len);root[0]=1;
for(int i=1;i<=n;i++){
root[i]=++cnt;
change(root[i],root[i-1],1,len,t[i],1);
}
while(T--){
int x,y,k;
read(x);read(y);read(k);
printf("%d\n",query(root[y],root[x-1],1,len,k));
}
return 0;
}