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.