【模板】主席树
作者:互联网
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=200011,M=N<<5; 4 int n,m,a[N],b[N],num,tot,rt[N]; 5 int cnt[M],ch[M][2]; 6 7 inline int re_ad() { 8 char ch=getchar(); int x=0,f=1; 9 while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } 10 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 11 return x*f; 12 } 13 14 inline void pushup(int d) { 15 cnt[d]=cnt[ch[d][0]]+cnt[ch[d][1]]; 16 } 17 18 int build(int l,int r) { 19 int d=++tot; 20 if(l==r) return d; 21 int mid=(l+r)>>1; 22 ch[d][0]=build(l,mid); 23 ch[d][1]=build(mid+1,r); 24 return d; 25 } 26 27 int update(int p,int l,int r,int k) { 28 int d=++tot; 29 if(l==r) { 30 cnt[d]=cnt[p]+1; 31 return d; 32 } 33 int mid=(l+r)>>1; 34 ch[d][0]=ch[p][0],ch[d][1]=ch[p][1]; 35 if(k<=mid) ch[d][0]=update(ch[p][0],l,mid,k); 36 else ch[d][1]=update(ch[p][1],mid+1,r,k); 37 pushup(d); 38 return d; 39 } 40 41 int query(int p,int d,int l,int r,int k) { 42 if(l==r) return l; 43 int cur=cnt[ch[d][0]]-cnt[ch[p][0]]; 44 int mid=(l+r)>>1; 45 if(cur>=k) return query(ch[p][0],ch[d][0],l,mid,k); 46 else return query(ch[p][1],ch[d][1],mid+1,r,k-cur); 47 } 48 49 int main() 50 { 51 int x,y,z,k; 52 n=re_ad(),m=re_ad(); 53 for(int i=1;i<=n;++i) b[i]=a[i]=re_ad(); 54 sort(b+1,b+n+1); 55 num=unique(b+1,b+n+1)-b-1; 56 for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+num+1,a[i])-b; 57 rt[0]=build(1,num); 58 for(int i=1;i<=n;++i) rt[i]=update(rt[i-1],1,num,a[i]); 59 for(int i=1;i<=m;++i) { 60 x=re_ad(),y=re_ad(),k=re_ad(); 61 z=query(rt[x-1],rt[y],1,num,k); 62 printf("%d\n",b[z]); 63 } 64 return 0; 65 }
标签:ch,return,ad,int,mid,模板,query,主席 来源: https://www.cnblogs.com/shangguanshufang/p/mo_ban_zhu_xi_shu.html