Насколько я понимаю, позиция xi'th элемента никогда не меняется, и дерево не является деревом поиска, поиск основан исключительно на позиции узла.
Вы можете сохранить смещение в вершинах без листьев, указывающих на изменение значения его потомка.
add(i,j,k)
начнется с корня, углубится в дереве и увеличит значение узла наk тогда и только тогда, когда все его потомки находятся в диапазоне [i,j]
.Если это увеличило значение, дальнейшее углубление не произойдет.
Примечание 1: В одной операции add()
может потребоваться добавить более одного числа.
Примечание 2: На самом деле вам нужно добавить не более O(logn) = O(logh)
значений [убедитесь сами, почему.Подсказка: двоичное представление числа до n
требует O(logn)
бит], что позже дает вам [снова, убедитесь, что вы понимаете, почему] O(logh)
необходима сложность.: суммируйте значения от корня до i-го листа и верните эту сумму.
Поскольку это кажется домашней работой, я не буду публиковать псевдокод, это руководство должно помочь вам начать работу с этим заданием.