#include<cstdio>
#include<algorithm>
#define lc lson[p]
#define rc rson[p]
#define N 1919810
using namespace std;
int n,m,a[N],b[N],rt[N],len;
int lsh(int *a,int n){
for(int i=1;i<=n;i++)b[i]=a[i];
sort(b+1,b+n+1);int k=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+k+1,a[i])-b;
return k;
}
struct Segement_tree{
int lson[7300000],rson[7300000],siz[7300000],tot;
void add(int &p,int l,int r,int x,int v){
if(!p)p=++tot;
siz[p]+=v;
if(l==r)return;
int mid=(l+r)/2;
if(x<=mid)add(lc,l,mid,x,v);
else add(rc,mid+1,r,x,v);
}
int merge(int a,int b){
if(!a||!b)return a+b;
int x=++tot;
siz[x]=siz[a]+siz[b];
lson[x]=merge(lson[a],lson[b]);
rson[x]=merge(rson[a],rson[b]);
return x;
}
int query(int p,int b,int l,int r,int k){
if(l==r)return l;
int del=siz[lson[b]]-siz[lc];
int mid=(l+r)/2;
if(k<=del)return query(lc,lson[b],l,mid,k);
else return query(rc,rson[b],mid+1,r,k-del);
}
}s;
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
len=lsh(a,n);
for(int i=1;i<=n;i++)s.add(rt[i],1,len,a[i],1);
for(int i=2;i<=n;i++)rt[i]=s.merge(rt[i],rt[i-1]);
while(m--){
int l,r,k,x;
scanf("%d%d%d",&l,&r,&k);
x=s.query(rt[l-1],rt[r],1,len,k);
printf("%d\n",b[x]);
}
return 0;
}