#include<cstdio>
#include<algorithm>
using namespace std;
int a[200001];
int b[200001];
int n,m;
int cnt;
int sum[6400001];
int T[200001];
int R[6400001];
int L[6400001];
int build(int l,int r)
{
int rt=++cnt;
sum[rt]=0;
if(l==r)
{
return rt;
}
int mid=(l+r)/2;
L[rt]=build(l,mid);
R[rt]=build(mid+1,r);
return rt;
}
int update(int pre,int l,int r,int x)
{
int rt=++cnt;
L[rt]=L[pre];
L[rt]=R[pre];
sum[rt]=sum[pre]+1;
int mid=(l+r)/2;
if(l==r)
return rt;
if(x<=mid)
{
L[rt]=update(L[pre],l,mid,x);
}
else
{
R[rt]=update(R[pre],mid+1,r,x);
}
return rt;
}
int query(int u,int v,int l,int r,int k)
{
if(l>=r)
{
return l;
}
int s=sum[L[v]]-sum[L[u]],mid=(l+r)/2;
if(k<=s)
{
return query(L[u],L[v],l,mid,k);
}
else
{
return query(R[u],R[v],mid+1,r,k-s);
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
int m=unique(b+1,b+1+n)-b-1;
T[0]=build(1,m);
for(i=1;i<=n;i++)
{
int t=lower_bound(b+1,b+1+m,a[i])-b;
T[i]=update(T[i-1],1,m,t);
}
for(i=1;i<=m;i++)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
int t=query(T[x-1],T[y],1,m,k);
printf("%d\n",b[t]);
}
}