//#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn = 100000+5; int cnt; struct node{ int l,r,sum; }T[maxn*40]; int root[maxn],a[maxn]; vector<int> v; int getid(int x){ return lower_bound(v.begin(),v.end(),x)-v.begin()+1; } void update(int l,int r,int &x,int y,int L){ T[++cnt]=T[y],T[cnt].sum++,x=cnt; if(l==r) return; int m=(l+r)>>1; if(L<=m) update(l,m,T[x].l,T[y].l,L); else update(m+1,r,T[x].r,T[y].r,L); } int query(int l,int r,int x,int y,int pos){ if(l==r) return l; int m=(l+r)>>1; int sum=T[T[y].l].sum-T[T[x].l].sum; if(sum>=pos) return query(l,m,T[x].l,T[y].l,pos); else return query(m+1,r,T[x].r,T[y].r,pos-sum); } 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++){ update(1,n,root[i],root[i-1],getid(a[i])); } for(int i=1;i<=m;i++){ 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; }
原文:https://www.cnblogs.com/MengX/p/10902703.html