rt
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
inline int read(){
int s=0,t=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') t=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=(s<<3)+(s<<1)+c-'0';c=getchar();
}
return s*t;
}
inline void write(int n){
if(n<0){
putchar('-');write(-n);
}
else{
if(n<10){
putchar(n+'0');return;
}
write(n/10);putchar(n%10+'0');
}
}
struct node{
int sum,l,r;
}t[MAXN<<5];
int tot,a[MAXN],b[MAXN],c[MAXN],r[MAXN];
inline void build(int &rt,int l,int r){
if(!rt) rt=++tot;
t[rt].sum=0;
if(l==r) return;
int mid=(l+r)>>1;
build(t[rt].l,l,mid);build(t[rt].r,mid+1,r);
}
inline void update(int &rt,int rt_,int l,int r,int k){
if(l<=k&&r>=k) rt=++tot;
t[rt]=t[rt_];++t[rt].sum;
if(l==r) return;
int mid=(l+r)>>1;
if(mid>=k) update(t[rt].l,t[rt_].l,l,mid,k);
else update(t[rt].r,t[rt_].r,mid+1,r,k);
}
inline int query(int rt1,int rt2,int l,int r,int k){
if(l>=r) return a[l];
int mid=(l+r)>>1;
if(t[t[rt2].l].sum-t[t[rt1].l].sum>=k) return query(t[rt1].l,t[rt2].l,l,mid,k);
else return query(t[rt1].r,t[rt2].l,mid+1,r,k-(t[t[rt2].l].sum-t[t[rt1].l].sum));
}
int main(){
int n,m,q,x,y,k;
n=read();m=read();
for(register int i=1;i<=n;++i) a[i]=b[i]=read();
sort(a+1,a+n+1);
q=unique(a+1,a+n+1)-(a+1);
build(r[0],1,q);
for(register int i=1;i<=q;++i) c[i]=lower_bound(a+1,a+q+1,b[i])-a;
for(register int i=1;i<=q;++i) update(r[i],r[i-1],1,q,c[i]);
for(register int i=1;i<=m;++i){
x=read();y=read();k=read();
write(query(r[x-1],r[y],1,q,k));
putchar('\n');
}
return 0;
}