RT
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
inline int R(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[40];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);putchar(10);
}
const int N=2e5+5;
struct node{
int leftson,rightson;
}d[N<<6];
int n,m;
int rt[N],a[N],s[N],cnt;
map<int,int>uid;
int build(int l,int r,int p){
p=++cnt;
if(l==r) return p;
int mid=(l+r)>>1;
d[p].leftson=build(l,mid,p);
d[p].rightson=build(mid+1,r,p);
return p;
}
int insert(int l,int r,int p,int k,int fa){
p=++cnt;
d[p].leftson=d[fa].leftson;
d[p].rightson=d[fa].rightson;
s[p]=s[fa]+1;
if(l==r) return p;
int mid=(l+r)>>1;
if(k<=mid) d[p].leftson=insert(l,mid,p,k,d[p].leftson);
else d[p].rightson=insert(mid+1,r,p,k,d[p].rightson);
return p;
}
int query(int L,int R,int l,int r,int p,int k){
if(l==r) return l;
p=s[d[R].leftson]-s[d[L].leftson];
int mid=(l+r)>>1;
if(k<=p) return query(d[L].leftson,d[R].rightson,l,mid,p,k);
else return query(d[L].rightson,d[R].rightson,mid+1,r,p,k-p);
}
int main(){
n=R(),m=R();
for(int i=1;i<=n;i++) a[i]=R();
sort(a+1,a+n+1);
n=unique(a+1,a+n+1)-(a+1);
for(int i=1;i<=n;i++) uid[a[i]]=++cnt;
cnt=0;
rt[0]=build(1,n,rt[0]);
for(int i=1;i<=n;i++){
rt[i]=(1,n,rt[i],uid[a[i]],rt[i-1]);
}
for(int i=1,l,r,k;i<=m;i++){
l=R(),r=R(),k=R();
write(a[query(rt[l-1],rt[r],1,n,0,k)]);
}
}