#include<bits/stdc++.h>
using namespace std;
long long tot,n,m;
long long sum[500010],rt[200010],ls[500010],rs[500010];
long long a[200010],ind[200010],len;
long long getid(const int &val) {
return lower_bound(ind+1,ind+len+1,val)-ind;
}
long long maketree(long long l,long long r){
long long root=++tot;
if(l==r){
return root;
}
int mid=(l+r)/2;
ls[root]=maketree(l,mid);
rs[root]=maketree(mid+1,r);
return root;
}
long long update(long long k,long long l,long long r,long long root){
long long dir=++tot;
ls[dir]=ls[root];
rs[dir]=rs[root];
sum[dir]=sum[root]+1;
if(l==r){
return dir;
}
long long mid=(l+r)/2;
if(k<=mid){
ls[dir]=update(k,l,mid,ls[dir]);
}else{
rs[dir]=update(k,mid+1,r,rs[dir]);
}
return dir;
}
long long query(long long u,long long v,long long l,long long r,long long k) {
long long mid=(l+r)/2;
long long x=sum[ls[v]]-sum[ls[u]];
if(l==r){
return l;
}
if(k<=x){
return query(ls[u],ls[v],l,mid,k);
}else{
return query(rs[u],rs[v],mid+1,r,k-x);
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memcpy(ind,a,sizeof(ind));
sort(ind+1,ind+n +1);
len=unique(ind+1,ind+n+1)-ind-1;
rt[0]=maketree(1, len);
for(long long i=1;i<=n;i++){
rt[i]=update(getid(a[i]),1,len,rt[i-1]);
}
while(m--){
long long l,r,k;
cin>>l>>r>>k;
cout<<ind[query(rt[l-1],rt[r],1,len,k)]<<endl;
}
return 0;
}
WA了后面五个点