Lazy array
Parallel array to tree storing pending updates. When descending into node, push pending to children first.
Advertisement
Update
void update(int node, int start, int end, int l, int r, long delta) {
push(node, start, end);
if (r < start || end < l) return;
if (l <= start && end <= r) {
tree[node] += delta * (end - start + 1);
lazy[node] += delta;
return;
}
int mid = (start + end) / 2;
update(2*node, start, mid, l, r, delta);
update(2*node+1, mid+1, end, l, r, delta);
tree[node] = tree[2*node] + tree[2*node+1];
}Advertisement
Push down
void push(int node, int start, int end) {
if (lazy[node] == 0 || start == end) return;
int mid = (start + end) / 2;
tree[2*node] += lazy[node] * (mid - start + 1);
lazy[2*node] += lazy[node];
tree[2*node+1] += lazy[node] * (end - mid);
lazy[2*node+1] += lazy[node];
lazy[node] = 0;
}