#include <bits/stdc++.h>
using namespace std;
struct czmg{
int l,r,s,lch,rch;
}tr[7000005];
int cnt,a[300005],n,m,b[300005],root[300005];
int clone(int u){
tr[++cnt]=tr[u];
return cnt;
}
void pushup(int u){
tr[u].s=tr[tr[u].lch].s+tr[tr[u].rch].s;
}
int build(int l,int r){
int u=++cnt;
tr[u].l=l,tr[u].r=r;
if (l==r) return u;
int mid=(l+r)/2;
tr[u].lch=build(l,mid);
tr[u].rch=build(mid+1,r);
return u;
}
int update(int x,int u){
u=clone(u);
int l=tr[u].l,r=tr[u].r;
if (l==r){
tr[u].s++;
return u;
}
int mid=(l+r)/2;
if (mid>=x) tr[u].lch=update(x,tr[u].lch);
else tr[u].rch=update(x,tr[u].rch);
pushup(u);
return u;
}
int getsum(int x,int u1,int u2){
if (tr[u1].l==tr[u1].r) return tr[u1].l;
int mid=tr[tr[u2].lch].s-tr[tr[u1].lch].s;
if (mid>=x) return getsum(x,tr[u1].lch,tr[u2].lch);
else return getsum(x-mid,tr[u1].rch,tr[u2].rch);
}
int main(){
ios::sync_with_stdio(0);
cin >> n >> m;
for (register int i=1;i<=n;i++) cin >> a[i],b[i]=a[i];
sort(b+1,b+1+n);
int len=unique(b+1,b+1+n)-b-1;
root[0]=build(1,n);
for (register int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+1+len,a[i])-b;
root[i]=update(a[i],root[i-1]);
}
while(m--){
int l,r,k;
cin >> l >> r >> k;
cout << b[getsum(k,root[l-1],root[r])] << endl;
}
}