#include<bits/stdc++.h>
using namespace std;
struct node {
int num;
int val;
} c[400005];
const int maxn=20000005;
int L[maxn],R[maxn],sum[maxn],T[maxn];
int z[400005];
int zz[400005];
int cnt=0;
int build(int l,int r) {
int num=++cnt;
if(l!=r) {
int mid=(l+r)/2;
L[num]=build(l,mid);
R[num]=build(mid+1,r);
}
return num;
}
int update(int pre,int l,int r,int x) {
int num=++cnt;
L[num]=L[pre];
R[num]=R[pre];
sum[num]=sum[pre]+1;
if(l!=r) {
int mid=(l+r)/2;
if(x<=mid)
L[num]=update(L[pre],l,mid,x);
else
R[num]=update(R[pre],mid+1,r,x);
}
return num;
}
int query(int u,int v,int l,int r,int k) {
if(l==r)
return zz[l];
int mid=(l+r)/2;
int num=sum[L[v]]-sum[L[u]];
if(num>=k)
return (query(L[u],L[v],l,mid,k));
else
return (query(R[u],R[v],mid+1,r,k-num));
}
bool cmp(node c1,node c2) {
return c1.val<c2.val;
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>c[i].val;
c[i].num=i;
}
sort(c+1,c+n+1,cmp);
int tot=0;
for(int i=1; i<=n; i++) {
if(c[i].val!=c[i-1].val)
tot++;
z[c[i].num]=tot;
zz[i]=c[i].val;
}
T[0]=build(1,tot);
for(int i=1; i<=n; i++) {
T[i]=update(T[i-1],1,tot,z[i]);
}
int l,r,k,p=0;
while(m) {
p++;
m--;
cin>>l>>r>>k;
cout<<query(T[l-1],T[r],1,tot,k)<<endl;
}
return 0;
}