#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
#define orz puts("fuck!!!")
int n,m,a[N];
int b[N];
struct chairman_segment_tree{
#define md(l,r) ((l+r)>>1)
struct node{
int l,r,w;
node *ls, *rs;
};
node* root[N];
void pushup(node* p) {
p -> w = p -> ls -> w + p -> rs -> w;
//orz;
}
void build(node* &p,int l,int r) {
p = new node();
p -> l = l, p -> r = r;
//p -> w = 0;
if (l == r) {
p -> w = 0;
return ;
}
int mid = md(l, r);
build(p -> ls, l, mid);
build(p -> rs, mid + 1, r);
pushup(p);
}
void update(node* p,node* lst,int k,int v) {
//if (lst == NULL) return ;
if (p == NULL) p = new node();
p -> l = lst -> l;
p -> r = lst -> r;
//cout<<p -> l<<' '<<p -> r<<endl;
if (p -> l == p -> r) {
p -> w = lst -> w + v;
//orz;
return ;
}
int mid = md(p -> l, p -> r);
if (k <= mid) p -> rs = lst -> rs,update(p -> ls, lst -> ls, k, v);
else p -> ls = lst -> ls,update(p -> rs, lst -> rs, k, v);
pushup(p);
//orz;
}
int query(node *u,node *v,int k) {
if (u -> l == u -> r) return u -> l;
int mid = md(u -> l, u -> r);
int tmp = v -> ls -> w - u -> ls -> w;
if (tmp >= k) return query(u -> ls, v -> ls, k);
else return query(u -> rs, v -> rs, k - tmp);
}
}T;
signed main(){
ios::sync_with_stdio(0);
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);
int up=unique(b+1,b+n+1)-b-1;
T.build(T.root[0],1,up);
//orz;
for(int i=1;i<=n;i++){
int now=lower_bound(b+1,b+up+1,a[i])-b;
//cout<<now<<endl;
T.update(T.root[i],T.root[i-1],now,1);
}
for(int i=1;i<=m;i++){
int l,r,k;cin>>l>>r>>k;
cout<<b[T.query(T.root[l-1],T.root[r],k)]<<endl;
}
return 0;
}
RE