#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e7+5;
int tot,root[N],n,m,a[N],f[N];
struct node{
int lson,rson,val;
}tree[N<<5];
int build(int l, int r){
int id = ++ tot;
if(l!=r){
int mid=(l+r)>>1;
tree[id].lson = build(l, mid);
tree[id].rson = build(mid+1, r);
}
return id;
}
int update(int l,int r,int pre,int x){
int id=++tot;
tree[id]=tree[pre];
tree[id].val=tree[pre].val+1;
if(l!=r){
int mid=l+r>>1;
if(x<=mid){
tree[id].lson=update(l,mid,tree[pre].lson,x);
}else{
tree[id].rson=update(mid+1,r,tree[pre].rson,x);
}
}
return id;
}
int query(int l,int r,int u,int v,int k)
{
if(l==r) return f[l];
int m=(l+r)>>1;
int num=tree[tree[v].lson].val-tree[tree[u].lson].val;
if(num>=k) return query(l,m,tree[u].lson,tree[v].lson,k);
else return query(m+1,r,tree[u].rson,tree[v].rson,k);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=a[i];
}
sort(f+1,f+1+n);
int size=unique(f+1,f+1+n)-f-1;
root[0]=build(1,size);
for(int i=1;i<=n;i++){
int x=lower_bound(f+1,f+1+size,a[i])-f;
root[i]=update(1,size,root[i-1],x);
}
for(int i=1;i<=m;i++){
int l,r,k;
cin>>l>>r>>k;
cout<<query(1,size,root[l-1],root[r],k)<<endl;
}
return 0;
}