#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
while(!isdigit(c)&&c!='-') c=getchar();
if(c=='-') f=0,c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?x:-x;
}
inline void write(register int x){
if(x<0) {
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=2e5+5;
struct tree {
int l,r,sz;
tree(){
l=r=sz=0;
}
}tr[N<<5];
int tot,a[N],tp[N],rt[N<<5];
int insert(int pre,int l,int r,int x) {
int p=++tot;
tr[p].l=tr[pre].l;
tr[p].r=tr[pre].r;
tr[p].sz=tr[pre].sz+1;
int mid=(l+r)>>1;
if(l<r) {
if(x<=mid) {
tr[p].l=insert(tr[pre].l,l,mid,x);
} else {
tr[p].r=insert(tr[pre].r,mid+1,r,x);
}
}
return p;
}
int que(int t1,int t2,int l,int r,int k) {
if(l==r) return l;
int sz=tr[tr[t2].l].sz-tr[tr[t1].l].sz;
int mid=(l+r)>>1;
if(sz>=k) {
que(tr[t1].l,tr[t2].l,l,mid,k);
} else {
que(tr[t1].r,tr[t2].r,mid+1,r,k-sz);
}
}
int build(int l,int r) {
int p=++tot;
tr[p].sz=0;
int mid=(l+r)/2;
if(l<r) {
tr[p].l=build(l,mid);
tr[p].r=build(mid+1,r);
}
return p;
}
int main() {
int n=read(),m=read();
for(int i=1;i<=n;i++) {
a[i]=read();
tp[i]=a[i];
}
sort(tp+1,tp+n+1);
int size=unique(tp+1,tp+n+1)-tp-1;
rt[0]=build(1,size);
for(int i=1;i<=n;i++) {
int p=lower_bound(tp+1,tp+size+1,a[i])-tp;
rt[i]=insert(rt[i-1],1,size,p);
}
while(m--) {
int l=read(),r=read(),k=read();
write(tp[que(rt[l-1],rt[r],1,size,k)]);
puts("");
}
return 0;
}