#include<bits/stdc++.h>
#define N 300050
using namespace std;
int a[N],b[N],n,m,rt[N],tot;
struct Node{int l,r,siz;}t[N*40];
int read(){
int cnt=0; char ch=0;
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();
return cnt;
}
void build(int &x,int l,int r){
x = ++tot;
if(l==r) return;
int mid = (l+r)>>1;
build(t[x].l,l,mid);
build(t[x].r,mid+1,r);
}
void Insert(int &x,int l,int r,int last,int pos){
x = ++tot;
t[x].l = t[last].l; t[x].r = t[last].r;
t[x].siz = t[last].siz + 1;
if(l==r) return;
int mid = (l+r)>>1;
if(pos<=mid) Insert(t[x].l,l,mid,t[last].l,pos);
else Insert(t[x].r,mid+1,r,t[last].r,pos);
}
int quary(int L,int R,int l,int r,int k){
if(l==r) return l;
int mid = (l+r)>>1;
int cnt = t[t[R].l].siz - t[t[L].l].siz;
if(k<=cnt) return quary(t[L].l,t[R].l,l,mid,k);
else return quary(t[L].r,t[R].r,mid+1,r,k-cnt);
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i] = b[i] = read();
sort(b+1,b+n+1); int siz = unique(b+1,b+n+1) - (b+1);
for(int i=1;i<=n;i++) a[i] = lower_bound(b+1,b+siz+1,a[i]) - b;
build(rt[0],1,siz);
for(int i=1;i<=n;i++) Insert(rt[i],1,siz,rt[i-1],a[i]);
for(int i=1;i<=m;i++){
int x=read(),y=read(),k=read();
printf("%d\n",b[quary(rt[x-1],rt[y],1,siz,k)]);
} return 0;
}