Я реализовал нечто подобное, основываясь на вопросе, который я задал на днях. Я добавил аннотации к узлам boost :: intrusive :: rbtree / avltree, чтобы вычислить размер каждого поддерева (число узлов foreach = node-> left-> count + node-> right-> count + 1). Я выполняю это обновление при вставке / удалении / перебалансировке дерева, используя хук boost value_traits для set_parent, set_left и set_right. Как уже говорилось на сайте, на который вы ссылались, после каждого обновления узла обновляйте размер текущего узла, а затем перемещайтесь вверх по дереву, пока не достигнете корня, обновляя размер каждого узла по мере продвижения.
Проблема возникает, когда вы хотите вставить в дерево в определенной позиции. Практически в тот момент, когда вы это сделаете, вы аннулируете инвариант порядка ключей для древовидной структуры. Это означает, что вы не сможете выполнить эффективный O (log n) поиск по ключу. Но, если вы этого хотите, вам, вероятно, в любом случае не понадобятся аннотации к размеру.