刚学线段树,有点不明白“给所有区间加x”的代码
如果我要加值的区间被某一段区间覆盖,而加值的这段区间正好处于我这段区间的中间,那么不就无法进行二分然后递归了吗?
我参考的代码如下↓
void change(int p,int x,int y,int z){
if(x<=t[p].l && y>=t[p].r){
t[p].pre+=(long long)z*(t[p].r-t[p].l+1);
t[p].add+=z;
return;
}
spread(p);
int mid=t[p].l+t[p].r>>1;
if(x<=mid) change(p*2,x,y,z);
if(y>mid) change(p*2+1,x,y,z);
t[p].pre=t[p*2].pre+t[p*2+1].pre;
}