1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| void print(){ cout<<"sum:"; for(int i=1;i<=2*n-1;i++) cout<<t[i]<<" "; cout<<endl<<"add:"; for(int i=1;i<=2*n-1;i++) cout<<add[i]<<" "; cout<<endl; } void Add(int cur,int l,int r,int v){ //给区间 [l,r]所有数加v add[cur]+=v; t[cur]+=(r-l+1)*v; return; } void pushdown(int cur,int l,int r){ //标记下传 if(add[cur]==0) return; int mid=l+r>>1; Add(cur*2,l,mid,add[cur]),Add(cur*2+1,mid+1,r,add[cur]); add[cur]=0;//请空标记 } void modify(int cur,int l,int r,int x,int y,int v){ //给区间[x,y]所有数加v if(l>=x && r<=y) { Add(cur,l,r,v); return; } int mid=l+r>>1; pushdown(cur,l,r); if(x<=mid) modify(2*cur,l,mid,x,y,v); if(mid<y) modify(2*cur+1,mid+1,r,x,y,v); t[cur]=t[2*cur]+t[2*cur+1]; } int query(int cur,int l,int r,int x,int y){ if(l>=x&&r<=y) return t[cur]; int mid=l+r>>1,res=0; pushdown(cur,l,r); if(x<=mid) res+=query(cur*2,l,mid,x,y); if(y>mid) res+=(cur*2+1,mid+1,r,x,y); return res; }
|