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;
}