#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+2333;
int n,m,cnt,all,a[MAXN],b[MAXN];
int rt[MAXN<<4],t[MAXN<<4],L[MAXN<<4],R[MAXN<<4];
int getnumber(int x){
return lower_bound(b+1,b+all+1,x)-b;
}
void update(int &now,int lst,int l,int r,int q){
t[now=++cnt]=t[lst]+1;
if (l==r) return;
int mid=l+r>>1;
if (q<=mid) R[now]=R[lst],update(L[now],L[lst],l,mid,q);
else L[now]=L[lst],update(R[now],R[lst],mid+1,r,q);
}
int query(int ql,int qr,int l,int r,int k) {
if (l==r) return b[l];
int mid=l+r>>1,tmp=t[L[qr]]-t[L[ql]];
return tmp>=k ? query(L[ql],L[qr],l,mid,k):query(R[ql],R[qr],mid+1,r,k-tmp);
}
int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar();}
while (isdigit(ch)) x=x*10+ch-48,ch=getchar();
return x*f;
}
int main(){
n=read(),m=read();
for (int i=1;i<=n;i++)
b[i]=a[i]=read();
sort(b+1,b+n+1);
all=unique(b+1,b+n+1)-b-1;
for (int i=1;i<=n;i++)
update(rt[i],rt[i-1],1,all,getnumber(a[i]));
int x,y,z;
while (m--){
x=read(),y=read(),z=read();
printf("%d\n",query(rt[x-1],rt[y],1,all,z));
}
return 0;
}