P3834 【模板】主席树
作者:互联网
注意点:
- MAXN可开到1e7.
#include<cstdio> #include<iostream> using namespace std; const int MAXN=1e7,INF=2e9; struct Node{ int ls,rs; int cnt; }tr[MAXN]; int nodeCnt=0; void insert(int p,int &q,int l,int r,int val){ if(!q)q=++nodeCnt; if(l==r){ tr[q].cnt=tr[p].cnt+1; return; } int mid=(l+r)>>1; if(val<=mid){ tr[q].rs=tr[p].rs; insert(tr[p].ls,tr[q].ls,l,mid,val); }else{ tr[q].ls=tr[p].ls; insert(tr[p].rs,tr[q].rs,mid+1,r,val); } tr[q].cnt=tr[tr[q].ls].cnt+tr[tr[q].rs].cnt; } int query(int p,int q,int l,int r,int k){ if(l==r)return l; int lsum=tr[tr[q].ls].cnt-tr[tr[p].ls].cnt; int mid=(l+r)>>1; if(k<=lsum)return query(tr[p].ls,tr[q].ls,l,mid,k); else return query(tr[p].rs,tr[q].rs,mid+1,r,k-lsum); } int root[MAXN]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int tmp; scanf("%d",&tmp); insert(root[i-1],root[i],-INF,INF,tmp); } for(int i=1;i<=m;i++){ int l,r,k; scanf("%d%d%d",&l,&r,&k); printf("%d\n",query(root[l-1],root[r],-INF,INF,k)); } return 0; }
标签:cnt,val,int,tr,P3834,MAXN,模板,1e7,主席 来源: https://www.cnblogs.com/zbsy-wwx/p/11746889.html