Вы можете хранить дополнительные значения в каждом узле дерева, назовем его дельта. Вы добавляете дельту узла к ключам, хранящимся во всех его потомках, чтобы получить фактические ключи. Таким образом, чтобы получить фактическое значение ключа в конкретном узле, вы суммируете все дельты от корня к этому узлу и добавляете эту сумму к сохраненному ключу.
Чтобы сделать Decrease-Upto
, вы просто меняете дельты O (log n) узлов на одном пути от корня.
Вам не нужно менять структуру дерева после этой операции, потому что это не меняет порядок ключей.