#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,tot,sz,a[N],b[N],sum[N*20],ls[N*20],rs[N*20],rt[N];
void discrete(){
sort(b+1,b+n+1);
sz=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+sz+1,a[i])-b;
}
void update(int &o,int pre,int l,int r,int x){
o=++tot;
sum[o]=sum[pre]+1;
ls[o]=ls[pre];
rs[o]=rs[pre];
if(l==r) return;
int mid=l+r>>1;
if(x<=mid) update(ls[o],ls[pre],l,mid,x);
else update(rs[o],rs[pre],mid+1,r,x);
}
int query(int s,int t,int l,int r,int k){
if(l==r) return l;
int cnt=sum[ls[t]]-sum[ls[s]];
int mid=l+r>>1;
if(cnt<k) return query(rs[s],rs[t],mid+1,r,k-cnt);
else return query(ls[s],ls[t],l,mid,k);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
discrete();
for(int i=1;i<=n;++i) update(rt[i],rt[i-1],1,sz,a[i]);
while(m--){
int x,y,k;scanf("%d%d%d",&x,&y,&k);
printf("%d\n",b[query(rt[x-1],rt[y],1,sz,k)]);
}
return 0;
}
主席树模板
最新推荐文章于 2022-11-15 19:29:36 发布