剩下全部WA```cpp #include<bits/stdc++.h> using namespace std; const int N=200010; struct tree{ int l,r,ls,rs,val; }a[N<<5]; int s[N],ss[N],cnt,root[N]; int build(int p,int l,int r){ p = ++cnt; a[p].l=l,a[p].r=r; if(l==r) return p; int mid=(l+r)>>1; a[p].ls=build(0,l,mid); a[p].rs=build(0,mid+1,r); return p; }
int change(int p,int k){ a[++cnt]=a[p]; p=cnt;//新建点
int l=a[p].l,r=a[p].r;
if(l==r){
a[p].val=1;
return p;
}
int mid=(l+r)>>1;
if(k<=mid) a[p].ls=change(a[p].ls,k);
else a[p].rs=change(a[p].rs,k);
a[p].val=a[a[p].ls].val+a[a[p].rs].val;//pushup
return p;
}
int quest(int x,int y,int k){ if(a[x].l==a[x].r) return a[x].l; int temp=a[a[y].ls].val-a[a[x].ls].val; if(k<=temp) return quest(a[x].ls,a[y].ls,k); else return quest(a[x].rs,a[y].rs,k-temp); }
int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&s[i]),ss[i]=s[i];
sort(ss+1,ss+1+n);
int num=unique(ss+1,ss+1+n)-ss-1;
root[0]=build(1,1,num);
for(int i=1;i<=n;i++){
s[i]=lower_bound(ss+1,ss+1+num,s[i])-ss;
root[i]=change(root[i-1],s[i]);
}//离散化,插入
for(int i=1;i<=m;i++){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
printf("%d\n",ss[quest(root[x-1],root[y],k)]);
}
}