[模板]主席树

 1 void tadd(int &p,int l,int r,int goal,int ww){
 2     if(!p)p=++cnt;w[p]+=ww;
 3     if(l==r)return;
 4     if(goal<=((l+r)>>1))tadd(lc[p],l,(l+r)>>1,goal,ww);
 5     else tadd(rc[p],((l+r)>>1)+1,r,goal,ww);
 6 }
 7 void add(int k,int num,int ww){for(;k<=n;k+=lowbit(k))tadd(rt[k],1,cnt2,num,ww);}
 8 int que(int l,int r,int rank){
 9     if(l==r)return l;
10     int times=0;
11     for(int i=1;i<=nq1;++i)times+=w[lc[qadd[i]]];//printf("%d %d %d\n",l,(l+r)>>1,times);
12     for(int i=1;i<=nq2;++i)times-=w[lc[qdec[i]]];//printf("%d %d %d\n",l,(l+r)>>1,times);
13     if(times<rank){
14         for(int i=1;i<=nq1;++i)qadd[i]=rc[qadd[i]];
15         for(int i=1;i<=nq2;++i)qdec[i]=rc[qdec[i]];
16         return que(((l+r)>>1)+1,r,rank-times);
17     }
18     for(int i=1;i<=nq1;++i)qadd[i]=lc[qadd[i]];
19     for(int i=1;i<=nq2;++i)qdec[i]=lc[qdec[i]];
20     return que(l,(l+r)>>1,rank);
21 }
22 int query(int l,int r,int k){
23     nq1=nq2=0;
24     for(int i=r;i;i-=lowbit(i))qadd[++nq1]=rt[i];
25     for(int i=l-1;i;i-=lowbit(i))qdec[++nq2]=rt[i];
26     return que(1,cnt2,k);
27 }
View Code

 

posted @ 2019-07-07 07:34  DeepinC  阅读(85)  评论(0编辑  收藏  举报