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;
}Range set + assign
Different lazy semantics: 'add delta' vs 'set to value'. Requires two lazy fields or careful order.