主席树
#include <bits/stdc++.h> using namespace std; const int maxn=200100; struct node { int l,r,sum; } hjt[maxn*40]; int cnt,root[maxn*40]; vector<int>v; int a[maxn]; int getid(int x) { return lower_bound(v.begin(),v.end(),x)-v.begin()+1; } void insert(int l,int r,int pre,int &now,int p) { hjt[++cnt]=hjt[pre]; now=cnt; hjt[now].sum++; if (l==r) { return; } int mid=(l+r)>>1; if (p<=mid) { insert(l,mid,hjt[pre].l,hjt[now].l,p); } else { insert(mid+1,r,hjt[pre].r,hjt[now].r,p); } } int query(int l,int r,int L,int R,int k) { if (l==r) return l; int mid=(l+r)>>1; int tmp=hjt[hjt[R].l].sum-hjt[hjt[L].l].sum; if (k<=tmp) { return query(l,mid,hjt[L].l,hjt[R].l,k); } else { return query(mid+1,r,hjt[L].r,hjt[R].r,k-tmp); } } int main() { int n,m; scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) { scanf("%d",&a[i]); v.push_back(a[i]); } sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); for (int i=1; i<=n; i++) { insert(1,n,root[i-1],root[i],getid(a[i])); } while (m--) { int l,r,k; scanf("%d%d%d",&l,&r,&k); printf("%d\n",v[query(1,n,root[l-1],root[r],k)-1]); } return 0; }