Path copying

Node update(Node old, int start, int end, int idx, int val) {
  if (start == end) return new Node(val);
  int mid = (start + end) / 2;
  Node fresh = new Node(old);
  if (idx <= mid) fresh.left = update(old.left, start, mid, idx, val);
  else fresh.right = update(old.right, mid + 1, end, idx, val);
  fresh.sum = fresh.left.sum + fresh.right.sum;
  return fresh;
}
Advertisement

Space per update

O(log N) — only nodes on path from root to updated leaf are copied. Others shared.

Advertisement

Total space over V versions

O((N + V) log N). Manageable for large N + many versions.

Kth smallest in range

Merge sort tree via persistent segment tree. Binary search descent with counts.