莫队算法。。不过 TLE了。。 ++
#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <cmath>
#define mp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define pLL pair<long long ,long long>
#define rep(i,j,k) for(int i = j; i < k;i++)
#define MAX(x,a) x=((x)<(a))?(a):(x);
#define MIN(x,a) x=((x)>(a))?(a):(x);
using namespace std;
const int N = 1e5+10;
int SQRT = 333;
int n,m;
template <class T>
inline void scan_d(T &ret) {
char c; ret=0;
while((c=getchar())<'0'||c>'9');
while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();
}
//适用于正负整数
template <class T>
inline bool fuckD(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return 0; //EOF
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
struct ed{
int l,r,k,ind;
void input(){
scan_d(l),scan_d(r),scan_d(k);
l--,r--;
}
}E[N>>3];
bool cmp(int i,int j){
if(E[i].l/ SQRT == E[j].l / SQRT)
return E[i].r < E[j].r;
return E[i].l < E[j].r;
}
int idx[N];
int a[N],b[N];
int ans[N];
#define lowbit(t) (t&(-t))
int cntt;
int sum[N];
void update(int pos,int val){
for( ; pos <= cntt;pos+=lowbit(pos))
sum[pos]+=val;
}
int query(int pos){
int ret = 0;
for( ; pos ;pos-=lowbit(pos))
ret += sum[pos];
return ret;
}
int solve(int kth){
int l = 1, r = cntt;
int ret = 0 , ss,mid;
while(l<=r){
mid = (l+r)>>1;
ss = query(mid);
if(ss < kth){
l = mid+1;
}else if(ss > kth){
r = mid-1;
}else{
ret = mid ;
r=mid-1;
}
}
return ret;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
rep(i,0,n) fuckD(a[i]);
SQRT = (int)sqrt(1.0*n);
memcpy(b,a,sizeof(a));
sort(b,b+n);
cntt = unique(b,b+n)-b;
rep(i,0,n)a[i] = lower_bound(b,b+cntt,a[i])-b;
rep(i,0,m)E[i].input(),E[i].ind=i;
rep(i,0,m)idx[i]=i;
sort(idx,idx+m,cmp);
memset(sum,0,sizeof(sum));
int pl = 0,pr = -1;
rep(i,0,m){
int l = E[idx[i]].l,r = E[idx[i]].r,k = E[idx[i]].k, ind = E[idx[i]].ind;
while(pr < r) update(a[++pr]+1,1);
while(pr > r) update(a[pr--]+1,-1);
while(pl > l) update(a[--pl]+1,1);
while(pl < l) update(a[pl++]+1,-1);
ans[ind] = solve(k)-1;
}
rep(i,0,m)
printf("%d\n",b[ans[i]]);
}
return 0;
}