RT
#include<iostream>
#include<cstdio>
#include<cstring>
#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,nn,m;
int rt[N<<6],a[N],b[N],s[N<<6],cnt;
int gnn(int i){
return lower_bound(a+1,a+n+1,b[i])-a;
}
int build(int l,int r){
int p=++cnt;
if(l==r) return p;
int mid=(l+r)>>1;
d[p].leftson=build(l,mid);
d[p].rightson=build(mid+1,r);
return p;
}
int insert(int l,int r,int k,int root){
int p=++cnt;
d[p]=d[root];
s[p]=s[root]+1;
if(l==r) return p;
int mid=(l+r)>>1;
if(k<=mid) d[p].leftson=insert(l,mid,k,d[root].leftson);
else d[p].rightson=insert(mid+1,r,k,d[root].rightson);
return p;
}
int query(int u,int v,int l,int r,int k){
if(l==r) return l;
int p=s[d[v].leftson]-s[d[u].leftson];
int mid=(l+r)>>1;
if(k<=p) return query(d[u].leftson,d[v].leftson,l,mid,k);
else return query(d[u].rightson,d[v].rightson,mid+1,r,k-p);
}
int main(){
nn=R(),m=R();
for(int i=1;i<=nn;i++){
b[i]=R();
a[i]=b[i];
}
sort(a+1,a+nn+1);
n=unique(a+1,a+nn+1)-a-1;
rt[0]=build(1,n);
for(int i=1;i<=nn;i++){
rt[i]=(1,n,gnn(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,k)]);
}
}