模板—主席树
#include<bits/stdc++.h> using namespace std; const int maxn=2e6+7; int n,m,q; int a[maxn]; int b[maxn]; int root[maxn]; int lc[maxn<<5]; int rc[maxn<<5]; int sum[maxn<<5]; int l,r,k,p; int cnt; void build(int &t,int l,int r) { t=++cnt; if(l==r) return; int mid=(l+r)>>1; build(lc[t],l,mid); build(rc[t],mid+1,r); } int modify(int o,int l,int r) { int oo=++cnt; lc[oo]=lc[o],rc[oo]=rc[o],sum[oo]=sum[o]+1; if(l==r) return oo; int mid=(l+r)>>1; if(p<=mid) lc[oo]=modify(lc[oo],l,mid); else rc[oo]=modify(rc[oo],mid+1,r); return oo; } int query(int u,int v,int l,int r,int k) { int ans,mid=(l+r)>>1,x=sum[lc[v]]-sum[lc[u]]; if(l==r) return l; if(x>=k) ans=query(lc[u],lc[v],l,mid,k); else ans=query(rc[u],rc[v],mid+1,r,k-x); return ans; } int main() { int ans; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+1+n); q=unique(b+1,b+1+n)-b-1; build(root[0],1,q); for(int i=1;i<=n;i++) { p=lower_bound(b+1,b+q+1,a[i])-b; root[i]=modify(root[i-1],1,q); } for(int i=1;i<=m;i++) { scanf("%d%d%d",&l,&r,&k); ans=query(root[l-1],root[r],1,q,k); printf("%d\n",b[ans]); } return 0; }