[模板]主席树
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
$Fate \ is \ Fake$