……到底是 O(mlogn) 还是 O(mlog2n)?
(不是求调,已经 AC 了)
void add(int xb,int v,int spread)
{
all[xb]+=v;
if(spread) while(xb>1) xb>>=1,all[xb]+=v;
}
void mdf(int l,int r,int v,int ii,int aa,int xb)//modify
{
while(1)
{
if(l==ii&&r==aa) {a[xb]+=v,add(xb,(r-l+1)*v,1);return;}
int lmid=(ii+aa)>>1,rmid=lmid+1;
a[xb<<1]+=a[xb],add(xb<<1,(lmid-ii+1)*a[xb],0);a[(xb<<1)+1]+=a[xb],add((xb<<1)+1,(aa-rmid+1)*a[xb],0);a[xb]=0;
if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
if(r<=lmid) {aa=lmid;xb<<=1;continue;}
if(ii==l) {a[xb<<1]+=v,add(xb<<1,(lmid-l+1)*v,1);ii=rmid;l=rmid;xb<<=1;xb++;continue;}
if(aa==r) {a[(xb<<1)+1]+=v,add((xb<<1)+1,(r-rmid+1)*v,1);aa=lmid;r=lmid;xb<<=1;continue;}
mdf(l,lmid,v,ii,lmid,xb<<1);mdf(rmid,r,v,rmid,aa,(xb<<1)+1);
break;
}
}
int qry(int l,int r,int ii,int aa,int xb)//query
{
int ans=0;
while(1)
{
if(l==ii&&r==aa) return ans+all[xb];
int lmid=(ii+aa)>>1,rmid=lmid+1;
a[xb<<1]+=a[xb],add(xb<<1,(lmid-ii+1)*a[xb],0);a[(xb<<1)+1]+=a[xb],add((xb<<1)+1,(aa-rmid+1)*a[xb],0);a[xb]=0;
if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
if(r<=lmid) {aa=lmid;xb<<=1;continue;}
if(ii==l) {ans+=all[xb<<1];ii=rmid;l=rmid;xb<<=1;xb++;continue;}
if(aa==r) {ans+=all[(xb<<1)+1];aa=lmid;r=lmid;xb<<=1;continue;}
return ans+qry(l,lmid,ii,lmid,xb<<1)+qry(rmid,r,rmid,aa,(xb<<1)+1);
}
}