只过了 #1.
// Author:zymooll
#include<bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#define int long long
using namespace std;
int read(){
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')w=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=s*10+c-'0';
c=getchar();
}
return s*w;
}
void print(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>=10)print(x/10);
putchar(x%10+'0');
return;
}
int n,m;
struct Node{
int l,r,n,cnt;
}t[5000010];
int ncnt;
int root[200010];
int a[200010],b[200010];
int clone(int p){
t[++ncnt]=t[p];
t[ncnt].cnt++;
return ncnt;
}
int build(int p,int l,int r){
p=++ncnt;
if(l==r)return p;
int mid=(l+r)/2;
t[p].l=build(t[p].l,l,mid);
t[p].r=build(t[p].r,mid+1,r);
return p;
}
int modify(int p,int l,int r,int x){
p=clone(p);
if(l==r)return p;
int mid=(l+r)/2;
if(x<=mid)t[p].l=modify(t[p].l,l,mid,x);
else t[p].r=modify(t[p].r,mid+1,r,x);
return p;
}
int ask(int L,int R,int l,int r,int rk){
int mid=(l+r)/2,nrk=t[t[R].l].cnt-t[t[L].l].cnt;
if(l==r)return l;
if(nrk>=rk)return ask(t[L].l,t[R].l,l,mid,rk);
else return ask(t[L].r,t[R].r,mid+1,r,rk-nrk);
}
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=b[i]=read();
}
sort(a+1,a+1+n);
int size=unique(a+1,a+1+n)-a-1;
root[0]=build(root[0],1,size);
for(int i=1;i<=size;i++){
int ls=lower_bound(a+1,a+1+size,b[i])-a;
root[i]=modify(root[i-1],1,size,ls);
}
for(int i=1;i<=m;i++){
int l=read(),r=read(),k=read();
print(b[ask(root[l-1],root[r],1,size,k)]);
putchar('\n');
}
return 0;
}