#include<stdio.h> #include<algorithm> #include<string.h> #define MAXN 100010 #define MAXM 5050 using namespace std; struct tr{ int l,r,sum; }; tr tree[MAXN*50]; int root[MAXN]; int cnt; int jilu[MAXN],from[MAXN]; void updat(int s,int e,int &x,int y,int pos){ tree[++cnt]=tree[y]; x=cnt; tree[x].sum++; if(s==e)return; int mid=(s+e)>>1; if(mid>=pos) updat(s,mid,tree[x].l,tree[y].l,pos); else updat(mid+1,e,tree[x].r,tree[y].r,pos); } int query(int s,int e,int x,int y,int k){ if(s==e)return s; int mid=(s+e)>>1; if(tree[tree[y].l].sum-tree[tree[x].l].sum>=k) return query(s,mid,tree[x].l,tree[y].l,k); else return query(mid+1,e,tree[x].r,tree[y].r,k-tree[tree[y].l].sum+tree[tree[x].l].sum); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ scanf("%d",&jilu[i]); from[i]=jilu[i]; } sort(jilu,jilu+n); int num=unique(jilu,jilu+n)-jilu; for(int i=0;i<n;i++){ int id=upper_bound(jilu,jilu+num,from[i])-jilu; updat(1,num,root[i+1],root[i],id); } for(int i=0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("%d ",jilu[query(1,num,root[a-1],root[b],c)-1]); } return 0; }