主席树基本操作:静态区间第k大
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int INF=1e9+7,MAXN=2e5+50,SIZE=MAXN*20; int N,M,K; int tmp[MAXN],A[MAXN],rt[MAXN],order[MAXN]; int sz,lson[SIZE],rson[SIZE],sum[SIZE]; int init(int l,int r){ int cur=++sz; if(l<r){ int mid=(l+r)>>1; lson[cur]=init(l,mid); rson[cur]=init(mid+1,r); } return cur; } int modify(int pre,int l,int r,int x){ int cur=++sz; lson[cur]=lson[pre]; rson[cur]=rson[pre]; sum[cur]=sum[pre]+1; int mid=(l+r)>>1; if(l<r){ if(x<=mid) lson[cur]=modify(lson[pre],l,mid,x); else rson[cur]=modify(rson[pre],mid+1,r,x); } return cur; } int query(int x,int y,int l,int r,int k){ if(l==r) return l; int ii=sum[lson[y]]-sum[lson[x]],mid=(l+r)>>1; if(ii>=k){ return query(lson[x],lson[y],l,mid,k); }else{ return query(rson[x],rson[y],mid+1,r,k-ii); } } int main(){ scanf("%d%d",&N,&K); for(int i=1;i<=N;i++){ scanf("%d",tmp+i); A[i]=tmp[i]; } sort(A+1,A+N+1); int M=unique(A+1,A+N+1)-A-1; rt[0]=init(1,M); for(int i=1;i<=N;i++){ order[i]=lower_bound(A+1,A+M+1,tmp[i])-A; rt[i]=modify(rt[i-1],1,M,order[i]); } while(K--){ int ii,jj,kk; scanf("%d%d%d",&ii,&jj,&kk); printf("%d\n",A[query(rt[ii-1],rt[jj],1,M,kk)]); } return 0; }