Декартово дерево и оптимизации к нему.
- Писать на указателях (не на массивах)
- Хранить специальную вершину
Null
.
- Операции Calculate и Down
- На каждом уровне Split и Merge выполнять ровно по одной операции Calculate и Down.
Корневая оптимизация
- Структура это список отрезков. Отрезок = [L,R)
- Частичные суммы, флажки reverse для отрезков, флажки add и equal для отрезков.
- Операция Split. Режет, если нужно, и возвращает позицию, до которой дошла.
- Операция Balance. Вызывается каждый sqrt(N) операций. Создает список из одного отрезка [0,N) и пересчитывает частичные суммы.
- Д.З. Как делать минимум на отрезке?
- Вставка и удаление по явному и неявному ключу. Операции на отрезках сохраняются.
Практика
- reverse