RT
#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1ll)
#define ls(x) (x<<1ll)
#define rs(x) (x<<1ll|1ll)
int n,m;
int s[300001<<2];
struct nnode
{
int v,id;
}a[300001];
struct node
{
int l,r,k,id;
}q[300001];
int ans[300001];
int num[300001];
int fk[300001];
bool cmp(nnode x,nnode y)
{
return x.v<y.v;
}
bool cmpp(node x,node y)
{
if(fk[x.l]==fk[y.l]) return x.r<y.r;
return x.l<y.l;
}
void push_up(int p)
{
s[p]=s[ls(p)]+s[rs(p)];
}
void add(int rt,int l,int r,int k,int c)
{
if(l==k&&r==k){s[rt]+=c;return;}
s[rt]+=c;
if(k<=mid)add(ls(rt),l,mid,k,c);
else add(rs(rt),mid+1,r,k,c);
push_up(rt);
}
int ask(int rt,int l,int r,int k)
{
if(l==r)return l;
if(s[ls(rt)]>=k)return ask(ls(rt),l,mid,k);
else return ask(rs(rt),mid+1,r,k-s[rt<<1]);
}
void md()
{
int l=1,r=0;
for(int i=1;i<=m;i++)
{
while(r<q[i].r) add(1,1,n,num[++r],1);
while(r>q[i].r) add(1,1,n,num[r--],-1);
while(l<q[i].l) add(1,1,n,num[l++],-1);
while(l>q[i].l) add(1,1,n,num[--l],1);
ans[q[i].id]=a[ask(1,1,n,q[i].k)].v;
}
}
signed main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i].v,a[i].id=i;
int f=sqrt(n);
for(int i=1;i<=n;i++) fk[i]=(i-1)/f+1;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) num[a[i].id]=i;
for(int i=1;i<=m;i++)
{
cin>>q[i].l>>q[i].r>>q[i].k;
q[i].id=i;
}
sort(q+1,q+1+m,cmpp);
md();
for(int i=1;i<=m;i++) cout<<ans[i]<<'\n';
return 0;
}