#include<bits/stdc++.h>
#define int long long
using namespace std;
struct trnode{int d,ran,siz,lc,rc;}tr[300100];
int trlen,ans,rt,T1,T2,T3;
void pushup(int x){tr[x].siz=tr[tr[x].lc].siz+tr[tr[x].rc].siz+1;}
void split(int now,int k,int &x,int &y){
if(!now){x=y=0;return ;}
if(tr[now].d<=k){
x=now;split(tr[x].rc,k,tr[x].rc,y);
}
else{
y=now;split(tr[y].lc,k,x,tr[y].lc);
}
pushup(now);
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(tr[x].ran<tr[y].ran){
tr[x].rc=merge(tr[x].rc,y);
pushup(x);return x;
}
else{
tr[y].lc=merge(x,tr[y].lc);
pushup(y);return y;
}
}
int add(int d){
int now=++trlen;
tr[now]={d,0,1};tr[now].ran=rand();
return now;
}
void ins(int d){
split(rt,d,T1,T2);
rt=merge(T1,merge(add(d),T2));
}
int findkth(int x,int k){
if(k<=tr[tr[x].lc].siz) return findkth(tr[x].lc,k);
if(k==tr[tr[x].lc].siz+1) return x;
return findkth(tr[x].rc,k-tr[tr[x].lc].siz-1);
}
int work(int l,int r,int c){
split(rt,r,T1,T2);
split(T1,l-1,T1,T3);
int p=findkth(T3,c);
rt=merge(merge(T1,T3),T2);
return tr[p].d;
}
signed main(){
int n,m;scanf("%lld%lld",&n,&m);
for(int i=1,c;i<=n;i++) scanf("%lld",&c),ins(c);
while(m--){
int x,y,c;scanf("%lld%lld%lld",&x,&y,&c);
printf("%lld\n",work(x,y,c));
}
}