#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100001;
int a[maxn],copy_[maxn],tot=1,newn;
int tree[maxn<<5],ls[maxn<<5],rs[maxn<<5],sum[maxn<<5];
int build(int l,int r){
int p=++tot;
sum[p]=0;
if(l<r) ls[p]=build(l,l+r>>1),rs[p]=build((l+r>>1)+1,r);
return p;
}
int upd(int pre,int l,int r,int x){
int p=++tot;
ls[p]=ls[pre],rs[p]=rs[pre],sum[p]=sum[pre];
if(l<r)
if(x<=(l+r>>1)) ls[p]=upd(ls[pre],l,l+r>>1,x);
else rs[p]=upd(rs[pre],(l+r>>1)+1,r,x);
return p;
}
int query(int u,int v,int l,int r,int k){
if(l>=r) return l;
int num=sum[ls[v]]-sum[ls[u]];
if(num>=k) return query(ls[u],ls[v],l,l+r>>1,k);
else return query(rs[u],rs[v],(l+r>>1)+1,r,k-num);
}
int main(){
int n,m,cnt,l,r,k,temp;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",a+i),copy_[i]=a[i];
sort(copy_+1,copy_+1+n),cnt=unique(copy_+1,copy_+1+n)-(copy_+1);
tree[0]=build(1,cnt);
for(int i=1;i<=n;++i) tree[i]=upd(tree[i-1],1,cnt,lower_bound(copy_+1,copy_+1+cnt,a[i])-(copy_+1));
while(m--) scanf("%d%d%d",&l,&r,&k),printf("%d\n",copy_[query(tree[l-1],tree[r],1,cnt,k)]);
return 0;
}