#include<cstdio>
typedef long long ll;
struct tree{
int sum;
int lc, rc;
tree(int a=0,int b=0,int c=0) {
sum=a;
lc=b;
rc=c;
}
}node[5300001];
int cnt;
int newnode(int a,int b,int c) {
node[++cnt]=tree(a,b,c);
return cnt;
}
int add(int rt,ll x,ll l,ll r) {
if(l==r)
return newnode(node[rt].sum+1,0,0);
ll mid=l+r>>1;
if(x<=mid)
return newnode(node[rt].sum+1,add(node[rt].lc,x,l,mid),node[rt].rc);
return newnode(node[rt].sum+1,node[rt].lc,add(node[rt].rc,x,mid+1,r));
}
ll query(int rtl,int rtr,int k,ll l,ll r) {
if(l==r)
return l;
int lcsum=node[node[rtr].lc].sum-node[node[rtl].lc].sum;
ll mid=l+r>>1;
if(lcsum>=k)
return query(node[rtl].lc,node[rtr].lc,k,l,mid);
else
return query(node[rtl].rc,node[rtr].rc,k-lcsum,mid+1,r);
}
int root[500001];
int main() {
int n,m;
std::scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
ll x;
std::scanf("%lld",&x);
root[i]=add(root[i-1],x,0x8000000000000000LL,0x7fffffffffffffffLL);
}
while(m--) {
ll s,t,k;
std::scanf("%lld%lld%lld",&s,&t,&k);
std::printf("%lld\n",query(root[s-1],root[t],k,0x8000000000000000LL,0x7fffffffffffffffLL));
}
return 0;
}