Augment nodes
class Node { int val; int size; Node left, right; }
int sizeOf(Node n) { return n == null ? 0 : n.size; }Advertisement
Select k-th
Node select(Node n, int k) {
int leftSize = sizeOf(n.left);
if (k == leftSize + 1) return n;
return k <= leftSize ? select(n.left, k) : select(n.right, k - leftSize - 1);
}Advertisement
Rank of value
int rank(Node n, int val) {
if (n == null) return 0;
if (val < n.val) return rank(n.left, val);
if (val > n.val) return sizeOf(n.left) + 1 + rank(n.right, val);
return sizeOf(n.left) + 1;
}On updates
Insert/delete update sizes on the path. Rotations must preserve size augmentation.