参考第三篇题解
但是对于update中有一步不能理解
void update(int dep, ll x, ll y, int val) {
if (x >= X[tree[dep].r + 1] || y <= X[tree[dep].l]) return ;
//cout << x << " " << y << " " << tree[dep].l << " " << tree[dep].r << endl;
if (x <= X[tree[dep].l] && y >= X[tree[dep].r + 1]) {
tree[dep].sum += val;
push_up(dep);
return ;
}
ll mid = (X[tree[dep].l] + X[tree[dep].r + 1]) >> 1;
update(dep << 1, x, y, val);
update(dep << 1 | 1, x, y, val);
push_up(dep);
}
void update(int dep, ll x, ll y, int val) {
if (! tree[dep].l && ! tree[dep].r) return ;
//cout << x << " " << y << " " << tree[dep].l << " " << tree[dep].r << endl;
if (x <= X[tree[dep].l] && y >= X[tree[dep].r + 1]) {
tree[dep].sum += val;
push_up(dep);
return ;
}
ll mid = (X[tree[dep].l] + X[tree[dep].r + 1]) >> 1;
if (x <= mid) update(dep << 1, x, y, val);
if (y > mid) update(dep << 1 | 1, x, y, val);
push_up(dep);
}
以上两种写法有什么不同吗,为什么第一种写法全对,第二种写完0分。
求教