#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+5;
int n,m,rt,tot,a[maxn],ans[maxn];
int son[maxn][2],fa[maxn],cnt[maxn],siz[maxn],val[maxn];
struct Query{int l,r,k,id;}q[maxn];
void push_up(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];}
bool check(int x){return x==son[fa[x]][1];}
void rotate(int x){
int y=fa[x],z=fa[y],k=check(x);
son[y][k]=son[x][!k],fa[son[x][!k]]=y;
son[x][!k]=y,fa[y]=x,fa[x]=z;
if(z) son[z][son[z][1]==y]=x;
push_up(x),push_up(y);
}
void splay(int x,int k){
while(fa[x]!=k){
int y=fa[x],z=fa[y];
if(z!=k)rotate(check(x)^check(y)?x:y);
rotate(x);
}
if(!k)rt=x;
}
void find(int x){
int u=rt;
if(!u)return;
while(son[u][val[u]<x]&&x!=val[u])u=son[u][val[u]<x];
splay(u,0);
}
void insert(int x){
int u=rt,f=0;
while(u&&val[u]!=x)f=u,u=son[u][val[u]<x];
if(u)cnt[u]++;
else{
u=++tot;
if(f)son[f][val[f]<x]=u;
fa[tot]=f,val[tot]=x,siz[tot]=1,cnt[tot]=1;
}
splay(u,0);
}
int PreNext(int x,int op){
find(x);
int u=son[rt][op];
while(son[u][!op])u=son[u][!op];
return u;
}
void del(int x){
int pre=PreNext(x,0),nxt=PreNext(x,1);
splay(pre,0),splay(nxt,pre);
int u=son[nxt][0];
if(cnt[u]>1)cnt[u]--,splay(u,0);
else son[nxt][0]=0;
}
int kth(int x){
int u=rt;
while(1){
if(x<=siz[son[x][0]])u=son[u][0];
else if(x<=(siz[son[u][0]]+cnt[u]))return u;
else x-=(siz[son[u][0]+cnt[u]]),u=son[u][1];
}
}
bool cmp(Query x,Query y){
if(x.l==y.l)return x.r<y.r;
return x.l<y.l;
}
signed main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
insert(-2e9),insert(2e9);
for(int i=1,l,r,k;i<=m;i++)scanf("%d %d %d",&l,&r,&k),q[i]={l,r,k,i};
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
while(l<q[i].l)del(a[l]),l++;
while(l>q[i].l)l--,insert(a[l]);
while(r<q[i].r)r++,insert(a[r]);
while(r>q[i].r)del(a[r]),r--;
ans[q[i].id]=val[kth(q[i].k+1)];
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}