#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int tree[N<<5],ls[N<<5],rs[N<<5];//节点值 左子树编号 有字数编号
int root[N];//第i棵线段树gen的编号
int n,q;
int a[N],b[N],f[N];//原数组 离散化后数组
int tot=0;//当前编号
int x,y,k;
bool cmp(int a,int b){return a<b;}
int build(int l,int r)
{
int rt=++tot;
if(l==r) return rt;
int mid=l+((r-l)>>1);
ls[rt]=build(l,mid);
rs[rt]=build(mid+1,r);
return rt;
}
int update(int rt,int l,int r,int num)
{
int pre=++tot;
ls[pre]=ls[rt];
rs[pre]=rs[rt];
tree[pre]=tree[rt]+1;
if(l==r) return pre;
int mid=l+((r-l)>>1);
if(num<=mid) ls[pre]=update(ls[rt],l,mid,num);
else rs[pre]=update(rs[rt],mid+1,r,num);
return pre;
}
int query(int l,int r,int k,int s,int t)
{
if(s==t) return s;
int cf=tree[r]-tree[l];
int mid=s+((t-s)>>1);
if(k<=cf) return query(ls[l],ls[r],k,s,mid);
else return query(rs[l],rs[r],k-cf,mid+1,t);
}
signed main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1,cmp);
int len=unique(b+1,b+n+1)-b-1;
root[0]=build(1,len);
for(int i=1;i<=n;i++)
{
f[i]=lower_bound(b+1,b+len+1,a[i])-b;
root[i]=update(root[i-1],1,len,f[i]);
}
while(q--)
{
cin>>x>>y>>k;
cout<<b[query(root[x-1],root[y],k,1,len)]<<'\n';
}
return 0;
}