#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mx=5e7+5;
struct node
{
int val;
int l;int r;
}w[mx];
int a[mx],cnt,h[mx];
vector<int>c;
void build(int u,int l,int r)
{
if(l==r)
return ;
w[u].l=++cnt;
w[u].r=++cnt;
int mid=(l+r)/2;
build(w[u].l,l,mid);
build(w[u].r,mid+1,r);
}
void insert(int u,int last,int l,int r,int k)
{
if(l==r&&l==k)
{
w[u].val++;
return ;
}
int mid=(l+r)/2;
w[u].l=w[last].l;
w[u].r=w[last].r;
if(k<=mid)
{
w[u].l=++cnt;
insert(cnt,w[last].l,l,mid,k);
}
else
{
w[u].r=++cnt;
insert(cnt,w[last].r,mid+1,r,k);
}
w[u].val=w[w[u].l].val+w[w[u].r].val;
}
int inq(int last,int u,int l,int r,int k)
{
if(l>=r) return l;
int mid=(l+r)/2;
int vl=w[w[u].l].val-w[w[last].l].val;
if(vl<k)
return inq(w[last].r,w[u].r,mid+1,r,k-vl);
else
return inq(w[last].l,w[u].l,l,mid,k);
}
signed main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{ cin>>a[i];
c.push_back(a[i]);
}
sort(c.begin(),c.end());
c.erase(unique(c.begin(),c.end()),c.end());
for(int i=1;i<=n;i++)
a[i]=lower_bound(c.begin(),c.end(),a[i])-c.begin()+1;
h[0]=cnt=1;
int nn=c.size();
build(1,1,nn);
for(int i=1;i<=n;i++)
{
h[i]=++cnt;
insert(h[i],h[i-1],1,nn,a[i]);
}
for(int i=1;i<=m;i++)
{
int l,r,k;
cin>>l>>r>>k;
cout<<c[inq(h[l-1],h[r],1,nn,k)-1]<<endl;
}
return 0;
}