主席树模板题:http://acm.hdu.edu.cn/showproblem.php?pid=2665
#include<bits/stdc++.h>
#define ls ls_[i]
#define rs rs_[i]
#define mid (l+r)/2
using namespace std;
const int NN=100100;
int n,m,k,x,y,z,q,W,T,N,S,op,cnt,tmp,dst,cas,val,tot,idx,test;
int a[NN],has[NN],has_size;
int rot[NN],ls_[NN*20],rs_[NN*20],c[NN*20];
int get_hash(int x){return lower_bound(has+1,has+has_size+1,x)-has;}
void update(int l,int r,int pos,int &i,int i_){
i=++tot;
c[i]=c[i_]+1;
if(l==r) return ;
if(mid>=pos) update(l,mid,pos,ls,ls_[i_]),rs=rs_[i_];
else update(mid+1,r,pos,rs,rs_[i_]),ls=ls_[i_];
}
int get_kth(int l,int r,int k,int l_,int r_){
if(l==r) return l;
int c_ls=c[ls_[r_]]-c[ls_[l_]];
if(c_ls>=k) return get_kth(l,mid,k,ls_[l_],ls_[r_]);
return get_kth(mid+1,r,k-c_ls,rs_[l_],rs_[r_]);
}
void init(){
has_size=tot=0;
}
int main(){
ios::sync_with_stdio(false);
cin>>test;
while(test--){
cin>>n>>m;
init();
for(int i=1;i<=n;i++){
cin>>a[i];
has[++has_size]=a[i];
}
sort(has+1,has+has_size+1);
N=has_size+5;
for(int i=1;i<=n;i++){
int t=get_hash(a[i]);
update(0,N,t,rot[i],rot[i-1]);
}
for(int i=1;i<=m;i++){
cin>>x>>y>>k;
cout<<has[get_kth(0,N,k,rot[x-1],rot[y])]<<'\n';
}
}
}