RT
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 2*1000000
int tot,k;
int lc[N],rc[N],sum[N];
int n,m;
int a[N],bin[N],t[N];
void build(int &zz,int qq,int yy){
zz = ++ tot;
if(qq == yy) return ;
int mid = (qq + yy) >> 1;
build(lc[zz],qq,mid);
build(rc[zz],mid + 1,yy);
}
void change(int p,int v,int l,int r,int &x){
x =++ tot;
lc[x] = lc[p];
rc[x] = rc[p];
sum[x] = sum[p] + 1;
if(l == r) return;
int mid = (l + r) >> 1;
if(v <= mid) change(lc[p],v,l,mid,lc[x]);
else change(rc[p],v,mid + 1,r,rc[x]);
}
int query(int k,int l,int r,int x,int y){
if(l == r) return 1;
int s = sum[lc[y]] - sum[lc[x]],mid = (l + r) >> 1;
if(s < k) return query(k - s,mid + 1,r,rc[x],rc[y]);
else return query(k,l,mid,lc[x],lc[y]);
}
int main(){
tot = 0;
cin>>n>>m;
for(int i = 1 ;i <= n ;i++){
cin >> a[i];
bin[i] = a[i];
t[i] = 0;
}
sort(bin + 1,bin + n + 1);
int cnt = unique(bin + 1 , bin + n + 1) - bin - 1;
t[0] = 0;
for(int i = 1;i <= n ;i++){
a[i] = lower_bound(bin + 1,bin + cnt + 1,a[i]) - bin;
change(t[i - 1],a[i],1,cnt,t[i]);
}
int x,y,k;
while(m--){
cin>>x>>y>>k;
cout<<bin[query(k,1,cnt,t[x - 1],t[y])]<<endl;
}
return 0;
}