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.