rt,
#include<bits/stdc++.h>
using namespace std;
map<int,int>dui;
int cnt=1,ls[50000010],rs[50000010],tree[50000010],son,ans,a[200010],b[200010],root[200010],x,y,k;
void build(int l,int r,int point){
if(l==r)return;
int mid=(l+r)>>1;
ls[point]=++cnt;
build(l,mid,cnt);
rs[point]=++cnt;
build(mid+1,r,cnt);
}
int add(int l,int r,int point,int mu){
if(l==r){
tree[++cnt]=1;
return cnt;
}
int mid=(l+r)>>1;
if(mu<=mid){
son=add(l,mid,ls[point],mu);
ls[++cnt]=son;
rs[cnt]=rs[point];
tree[cnt]=tree[ls[cnt]]+tree[rs[cnt]];
return cnt;
}
else{
son=add(mid+1,r,rs[point],mu);
rs[++cnt]=son;
ls[cnt]=ls[point];
tree[cnt]=tree[ls[cnt]]+tree[rs[cnt]];
return cnt;
}
}
int check(int l,int r,int p1,int p2,int k){
if(l>=r)return l;
int mid=(l+r)>>1;
// cout<<"check"<<l<<' '<<r<<' '<<k<<endl;
// _sleep(100);
// cout<<"tree"<<tree[ls[p2]]<<" "<<tree[ls[p1]]<<endl;
if(tree[ls[p2]]-tree[ls[p1]]<k){
// cout<<"gor"<<endl;
check(mid+1,r,rs[p1],rs[p2],k-(tree[ls[p2]]-tree[ls[p1]]));
}
else if(tree[ls[p2]]-tree[ls[p1]]>=k){
// cout<<"gol"<<endl;
check(l,mid,ls[p1],ls[p2],k);
}
}
int main(){
int n,m;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)dui[b[i]]=i;
for(int i=1;i<=n;i++)a[i]=dui[a[i]];
build(1,n,1);
root[0]=1;
for(int i=1;i<=n;i++){
root[i]=add(1,n,root[i-1],a[i]);
}
for(int i=1;i<=m;i++){
cin>>x>>y>>k;
cout<<b[check(1,n,root[x-1],root[y],k)]<<"\n";
// cout<<endl;
}
return 0;
}
/*
5 5
25957 6405 15770 26287 26465
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1
*/