#include using namespace std; inline int read() { int x=0,f=1,c=getchar(); while(c<48) c=='-'&&(f=-1),c=getchar(); while(c>47) x=x*10+c-'0',c=getchar(); return x*f; } const int MAXN = 200005; int ls[MAXN*32],rs[MAXN*32],sum[MAXN*32]; int rt[MAXN],val[MAXN],raw[MAXN]; int n,m,q,tot; void insert(int &x,int y,int l,int r,int k) { ls[x=++tot]=ls[y]; rs[x]=rs[y]; sum[x]=sum[y]+1; if(l==r) return; int mid=(l+r)>>1; if(k<=mid) insert(ls[x],ls[y],l,mid,k); if(k>mid) insert(rs[x],rs[y],mid+1,r,k); } int query(int x,int y,int l,int r,int k) { if(l==r) return l; int mid=(l+r)>>1,s=sum[ls[y]]-sum[ls[x]]; if(k<=s) return query(ls[x],ls[y],l,mid,k); return query(rs[x],rs[y],mid+1,r,k-s); } int main(int argc, char const *argv[]) { n=read(); q=read(); for(int i=1; i<=n; ++i) val[i]=raw[i]=read(); sort(val+1,val+n+1); m=unique(val+1,val+n+1)-val-1; for(int i=1,k; i<=n; ++i) { k=lower_bound(val+1,val+m+1,raw[i])-val; insert(rt[i],rt[i-1],1,m,k); } for(int i=1,l,r,k,x; i<=q; ++i) { l=read(); r=read(); k=read(); x=query(rt[l-1],rt[r],1,m,k); printf("%d\n", val[x]); } return 0; }