Array representation

int[] tree = new int[4 * n];
void build(int node, int start, int end, int[] arr) {
  if (start == end) { tree[node] = arr[start]; return; }
  int mid = (start + end) / 2;
  build(2*node, start, mid, arr);
  build(2*node+1, mid+1, end, arr);
  tree[node] = tree[2*node] + tree[2*node+1];
}
Advertisement

Range query

long query(int node, int start, int end, int l, int r) {
  if (r < start || end < l) return 0;
  if (l <= start && end <= r) return tree[node];
  int mid = (start + end) / 2;
  return query(2*node, start, mid, l, r) + query(2*node+1, mid+1, end, l, r);
}
Advertisement

Point update

void update(int node, int start, int end, int idx, int val) {
  if (start == end) { tree[node] = val; return; }
  int mid = (start + end) / 2;
  if (idx <= mid) update(2*node, start, mid, idx, val);
  else update(2*node+1, mid+1, end, idx, val);
  tree[node] = tree[2*node] + tree[2*node+1];
}

Lazy propagation

Range updates by pushing deferred changes down only when needed. Enables O(log N) range update + range query.

Array representation

int[] tree = new int[4 * n];
void build(int node, int start, int end, int[] arr) {
  if (start == end) { tree[node] = arr[start]; return; }
  int mid = (start + end) / 2;
  build(2*node, start, mid, arr);
  build(2*node+1, mid+1, end, arr);
  tree[node] = tree[2*node] + tree[2*node+1];
}

Range query

long query(int node, int start, int end, int l, int r) {
  if (r < start || end < l) return 0;
  if (l <= start && end <= r) return tree[node];
  int mid = (start + end) / 2;
  return query(2*node, start, mid, l, r) + query(2*node+1, mid+1, end, l, r);
}

Point update

void update(int node, int start, int end, int idx, int val) {
  if (start == end) { tree[node] = val; return; }
  int mid = (start + end) / 2;
  if (idx <= mid) update(2*node, start, mid, idx, val);
  else update(2*node+1, mid+1, end, idx, val);
  tree[node] = tree[2*node] + tree[2*node+1];
}

Lazy propagation

Range updates by pushing deferred changes down only when needed. Enables O(log N) range update + range query.