#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct tree
{
int id,ls,rs,mark,sum;
}tr[N<<6];
int n,m,cnt,a[N],b[N],c[N],top,rt[N],v,q,loc,val;
int build(int u,int l,int r)
{
u=++cnt;
int mid=(l+r)>>1;
if(l<r)
{
tr[u].ls=build(tr[u].ls,l,mid);
tr[u].rs=build(tr[u].rs,mid+1,r);
}
return u;
}
int clone(int u)
{
++cnt;
tr[cnt]=tr[u];
return cnt;
}
int up(int u,int l,int r,int val)
{
u=clone(u);
tr[u].sum++;
int mid=(l+r)>>1;
if(l<r)
{
if(val<=mid)tr[u].ls=up(tr[u].ls,l,mid,val);
else tr[u].rs=up(tr[u].rs,mid+1,r,val);
}
return u;
}
int query(int u,int v,int l,int r,int k)
{
if(l>=r)return l;
int mid=(l+r)>>1;
int x=tr[tr[v].ls].sum-tr[tr[u].ls].sum;
if(x>=k)return query(tr[u].ls,tr[v].ls,l,mid,x);
else return query(tr[u].rs,tr[v].ls,mid+1,r,k-x);
}
int main()
{
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
int len=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+len+1,a[i])-b;
rt[0]=build(1,1,len);
for(int i=1;i<=n;i++)rt[i]=up(rt[i-1],1,len,a[i]);
for(int i=1;i<=m;i++)
{
int l,r,k;
cin>>l>>r>>k;
cout<<b[query(rt[l-1],rt[r],1,len,k)]<<"\n";
}
return 0;
}