Массив разностей
Операция на отрезке превращается в два точечных изменения — и пометки становятся не нужны.
2 мин
Пусть . Что делает с этим массивом прибавление ко всем элементам отрезка ?
Внутри отрезка все элементы выросли одинаково — разности не изменились. Изменились ровно две: выросла на , уменьшилась на .
Никаких пометок, никакого проталкивания — обычное дерево с точечными изменениями.
Когда приём работает
Только если запрос тоже выражается через разности. Три примера.
Сколько соседних пар равны. Пара равна ровно тогда, когда . Запрос превращается в «сколько нулей в на отрезке».
Наибольшая серия подряд идущих. Условие «» — это , и вопрос сводится к самой длинной серии единиц: составной узел, который мы уже умеем.
НОД на отрезке. Здесь работает тождество
потому что . Само достаётся деревом сумм по разностям, остальное — деревом НОД.
Проверено перебором: на 30 000 случайных массивов длины до 10 обе части тождества совпали.
Когда не работает
Если спрашивают сумму на отрезке, разности не помогут: сумма разностей — это не сумма элементов. Здесь работает обратный приём — дерево по префиксным суммам, где прибавление на отрезке превращается в прибавление арифметической прогрессии.
Простой частный случай: если операция — прибавление на отрезке, а спрашивают значение одного элемента, достаточно дерева сумм по разностям, и значение элемента это сумма префикса.
Границы
Единственная тонкость приёма — края, и на них ломается половина решений.
- Массив разностей на единицу короче исходного.
- Запрос про — это отрезок разностей, и при он пуст.
- Разность существует при , разность — при .
Обязательный тест — массив из одного элемента и запрос к нему.
Мысль, которую стоит унести
Когда операция не ложится в пометку, меняйте не дерево, а представление массива. Разности — самый частый способ, но не единственный: рядом стоят дерево по значениям и разложение по битам.