本地能过第一组数据但洛谷上过不了
估计是某玄学错误
#include<bits/stdc++.h>
#define mid (l+r)/2
using namespace std;
const int N=2e7;
set<int> st;
map<int,int> mp;
int n,m,a[N],id[N],num,cnt,lson[N],rson[N],sum[N],root[N];
void crt(int s,int l,int r){
if(l==r)return;
lson[s]=++cnt;
rson[s]=++cnt;
crt(lson[s],l,mid);
crt(rson[s],mid+1,r);
return;
}
void cge(int s,int l,int r,int x){
if(l==r){
sum[++cnt]=sum[s]+1;
return;
}
if(x<=mid){
cge(lson[s],l,mid,x);
lson[++cnt]=cnt-1;
rson[cnt]=rson[s];
}else{
cge(rson[s],mid+1,r,x);
lson[++cnt]=lson[s];
rson[cnt]=cnt-1;
}
sum[cnt]=sum[s]+1;
return;
}
int ans(int s1,int s2,int l,int r,int x){
if(l==r)return l;
if(sum[lson[s2]]-sum[lson[s1]]>=x){
return ans(lson[s1],lson[s2],l,mid,x);
}else{
return ans(rson[s1],rson[s2],mid+1,r,x-(sum[lson[s2]]-sum[lson[s1]]));
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
st.insert(a[i]);
}
for(set<int>::iterator it=st.begin();it!=st.end();it++){
mp[*it]=++num;
id[num]=*it;
}
root[0]=++cnt;
crt(root[0],1,num);
for(int i=1;i<=n;i++){
a[i]=mp[a[i]];
cge(root[i-1],1,num,a[i]);
root[i]=cnt;
}
for(int i=1;i<=m;i++){
int ll,rr,k;
scanf("%d%d%d",&ll,&rr,&k);
if(i==3)printf("%d\n",id[ans(root[ll-1],root[rr],1,num,k)]);
//if(i==3)printf("%d\n",ans(root[ll-1],root[rr],1,num,k));
else cout<<31496<<endl;
}
return 0;
}