#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define N 100003 #define M 400003 using namespace std; int a[N],b[N],p[N],root[N],n,m,sz; struct data { int l,r,w; };data tree[M*20]; int cmp(int x,int y) { return a[x]<a[y]; } void insert(int &i,int l,int r,int x) { tree[++sz]=tree[i]; i=sz; tree[i].w++; if (l==r) return; int mid=(l+r)>>1; if (x<=mid) insert(tree[i].l,l,mid,x); else insert(tree[i].r,mid+1,r,x); } int query(int i,int j,int l,int r,int k) { if (l==r) return l; int t=tree[tree[j].l].w-tree[tree[i].l].w; int mid=(l+r)>>1; if (t>=k) return query(tree[i].l,tree[j].l,l,mid,k); else return query(tree[i].r,tree[j].r,mid+1,r,k-t); } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); p[i]=i; } sort(p+1,p+n+1,cmp); for (int i=1;i<=n;i++) b[p[i]]=i;//离散化,p[i]表示第i小的值在a[]中的下标 sz=0; root[0]=0; for (int i=1;i<=n;i++) { root[i]=root[i-1]; insert(root[i],1,n,b[i]); } for (int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); int t=query(root[x-1],root[y],1,n,z); printf("%d\n",a[p[t]]); } }