原题链接
int t,n,m,k,idx;
struct code{
int l,r;
int val;
}tr[N*40];
int c[N],v[N],s[M];
int rc[N];
LL vc[N];
void update(int p){
tr[p].val=tr[tr[p].l].val+tr[tr[p].r].val;
}
void change(int&p,int l,int r,int pos,int val){
if(!p) p=++idx;
if(l==r){
tr[p].val+=val;
return ;
}
int mid=l+r>>1;
if(pos<=mid) change(tr[p].l,l,mid,pos,val);
else change(tr[p].r,mid+1,r,pos,val);
update(p);
return ;
}
int query(int p,int l,int r,int L,int R){
if(!p) return 0;
if(L<=l and r<=R) return tr[p].val;
int mid=l+r>>1;
int res = 0;
if(L<=mid) res+=query(tr[p].l,l,mid,L,R);
if(R>mid) res+=query(tr[p].r,mid+1,r,L,R);
return res;
}
void clear(){
for(int i=1;i<=n;i++) rc[i]=vc[i]=0;
for(int i=1;i<=idx;i++) tr[i].l=tr[i].r=tr[i].val=0;
idx=0;
}