#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int a[N],b[N];
int root[N],tot;
int sz[N*20],ls[N*20],rs[N*20];
int copy(int p)
{
++tot;
sz[tot]=sz[p];
ls[tot]=ls[p];
rs[tot]=rs[p];
return tot;
}
int build(int pl,int pr)
{
int p=++tot;
if(pl==pr)
return p;
int mid=(pl+pr)>>1;
ls[p]=build(pl,mid);
rs[p]=build(mid+1,pr);
return p;
}
int update(int p,int pl,int pr,int x)
{
p=copy(p);
++sz[p];
if(pl==pr)
return p;
int mid=(pl+pr)>>1;
if(x<=mid)
ls[p]=update(ls[p],pl,mid,x);
else
rs[p]=update(rs[p],mid+1,pr,x);
return p;
}
int query(int u,int v,int pl,int pr,int k)
{
if(pl==pr)
return pl;
int x=sz[ls[v]]-sz[ls[u]],mid=(pl+pr)>>1;
if(k<=x)
return query(ls[u],ls[v],pl,mid,k);
return query(rs[u],rs[v],mid+1,pr,k-x);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[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;
root[0]=build(0,K);
for(int i=1;i<=n;++i)
root[i]=update(root[i-1],0,K,a[i]);
while(m--)
{
int l,r,k;
cin>>l>>r>>k;
cout<<b[query(root[l-1],root[r],0,K,k)]<<'\n';
}
}