#include<iostream>
#include<cstdio>
#include<stdio.h>
using namespace std;
const int N=1e6+10;
int n,tot=1,m,a[N],root[N];
struct node{
int lson,rson,sum;
}t[N*70];
inline int read(){
char ch;
ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
int f=0;
while(ch>='0'&&ch<='9'){
f=(f<<3)+(f<<1)+ch-48;
ch=getchar();
}
return f;
}
inline void update(int &o,int p,int l,int r,int x){
t[o=++tot]=t[p];
if(l==r){
t[o].sum++;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(t[o].lson,t[p].lson,l,mid,x);
else update(t[o].rson,t[p].rson,mid+1,r,x);
t[o].sum=t[t[o].lson].sum+t[t[o].rson].sum;
}
inline int query(int p,int o,int l,int r,int k){
if(l==r)return l;
int mid=l+r>>1;
int sum=t[t[o].lson].sum-t[t[p].lson].sum;
if(k<=sum)return query(t[p].lson,t[o].lson,l,mid,k);
else return query(t[p].rson,t[o].rson,mid+1,r,k-sum);
}
int main(){
freopen("text.txt","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
root[i]=root[i-1];
update(root[i],root[i-1],1,N,a[i]);
}
for(int i=1,l,r,k;i<=m;i++){
l=read(),r=read(),k=read();
printf("%d\n",query(root[l-1],root[r],1,N,k));
}
return 0;
}