#include<bits/stdc++.h>
#define N 200005
using namespace std;
int n,m,a[N],tmp[N],b[N],roots[N],cnt,tot=1;
int ask(int num) {
return lower_bound(b+1,b+cnt+1,num)-b;
}
struct node {
int val,ls,rs;
}t[N<<5];
#define val(x) t[x].val
#define ls(x) t[x].ls
#define rs(x) t[x].rs
void build(int now,int l,int r) {
if(l==r) {
val(now)=0;
return;
}
ls(now)=++tot;
rs(now)=++tot;
int mid=l+r>>1;
build(ls(now),l,mid);
build(rs(now),mid+1,r);
val(now)=val(ls(now))+val(rs(now));
}
void add(int now,int pre,int pos,int l,int r) {
if(l==r) {
val(now)=val(pre)+1;
return;
}
ls(now)=ls(pre),rs(now)=rs(pre),val(now)=val(pre)+1;
int mid=l+r>>1;
if(pos<=mid) ls(now)=++tot,add(ls(now),ls(pre),pos,l,mid);
else rs(now)=++tot,add(rs(now),rs(pre),pos,mid+1,r);
}
int query(int k,int now,int pre,int l,int r) {
if(l==r) {
return b[l];
}
int mid=l+r>>1;
if(val(ls(now))-val(ls(pre))>=k) return query(k,ls(now),ls(pre),l,mid);
else return query(k-val(ls(now))-val(ls(pre)),rs(now),rs(pre),mid+1,r);
}
int main() {
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
tmp[i]=a[i];
}
sort(tmp+1,tmp+n+1);
for(int i=1;i<=n;i++) {
if(i==1||tmp[i]!=tmp[i-1]) b[++cnt]=tmp[i];
}
roots[0]=1;
build(1,1,cnt);
for(int i=1;i<=n;i++) {
roots[i]=++tot;
add(roots[i],roots[i-1],ask(a[i]),1,cnt);
}
int l,r,k;
for(int i=1;i<=m;i++) {
scanf("%d %d %d",&l,&r,&k);
int ans=query(k,roots[r],roots[l-1],1,cnt);
printf("%d\n",ans);
}
return 0;
}
20分QwQ,只AC了测试点1,2