主席树代码求调,模板 原题目
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,nN;
int a[N],b[N],c[N],x,y,k;
struct tree{
struct pw{
int x,l,r;
} h[N<<5];
int root[N];
int tot;
inline int build(int x,int l,int r){
x=++tot;
if(l==r) return x;
int mid=(l+r)>>1;
h[x].l=build(h[x].l,l,mid);
h[x].r=build(h[x].r,mid+1,r);
return x;
}
inline int copy(int p){
h[++tot]=h[p];
h[tot].x++;
return tot;
}
inline int update(int x,int l,int r,int pos){
x=copy(x);
if(l==r) return x;
int mid=(l+r)>>1;
if(pos<=mid) h[x].l=update(h[x].l,l,mid,pos);
else h[x].r=update(h[x].r,mid+1,r,pos);
return x;
}
inline int quary(int l,int r,int dl,int dr,int k){
if(l==r) return b[l];
int mid=(l+r)>>1;
int ln=h[h[dr].l].x-h[h[dl].l].x;
if(k<=ln) return quary(l,mid,h[dl].l,h[dr].l,k);
else return quary(mid+1,r,h[dl].r,h[dr].r,k-ln);
}
}PST ;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) b[i]=a[i];
sort(b+1,b+n+1);
nN=unique(b+1,b+1+n)-b-1;
PST.root[0]=PST.build(PST.root[0],1,n);
for(int i=1;i<=n;i++) c[i]=upper_bound(b+1,b+nN+1,a[i])-b;
for(int i=1;i<=n;i++){
PST.root[i]=PST.update(PST.root[i-1],1,nN,c[i]);
}
for(int i=1;i<=m;i++){
cin>>x>>y>>k;
cout<<PST.quary(1,nN,PST.root[x-1],PST.root[y],k)<<endl;
}
return 0;
}