#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+50;
struct node{
int l,r,jgs;
}tree[N*30];
int q[N],bh[N],a[N],giao,qian,b[N];
int top,root[N],gs,gz,i1;
int n,m;
int l1,r1,k1,daan;
//
int build(int l,int r,int n){
int n1;
tree[++top]=tree[n];
n1=top;
if(l==r){
tree[n1].jgs++;
return n1;//返回根
}else{
int mid=(l+r)/2;
if(a[i1]<=mid)tree[n1].l=build(l,mid,tree[n].l);
if(a[i1]>mid)tree[n1].r=build(mid+1,r,tree[n].r);
tree[n1].jgs++;
return n1;
}
}
//
int cha(int n1,int n2,int l,int r,int k)
{
if(l>=r){
return-1;
}
int chazhi=tree[n1].jgs-tree[n2].jgs;
int mid=(l+r)/2;
if(chazhi>=k){
return cha(tree[n1].l,tree[n2].l,l,mid,k);
}else{
return cha(tree[n1].r,tree[n2].r,mid+1,r,k-chazhi);
}
}
//
int px(int a,int b){
if(q[a]<q[b]){
return a<b;
}else{
return b<a;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>q[i];
bh[i]=i;
}
sort(bh+1,bh+1+n,px);
qian=q[bh[1]]-1;
for(int i=1;i<=n;i++){
if(qian!=q[bh[i]]){
giao++;
}
a[bh[i]]=giao;
b[giao]=q[bh[i]];
}
for(int i=1;i<=n;i++){
i1=i;
gz=build(1,giao,root[i-1]);
root[i]=gz;
}
//cout<<"giao";
for(int i=1;i<=m;i++){
cin>>l1>>r1>>k1;
if(l1==r1&&k1==1){
cout<<q[l1]<<endl;
}else{
daan=cha(root[r1],root[l1-1],1,giao,k1);
cout<<b[daan]<<endl;
}
}
return 0;
}