Довідка та теорія
Дерево відрізків — це бінарне дерево, побудоване над індексами масиву, де кожен вузол покриває суцільний діапазон. Листки покривають окремі елементи; кожен внутрішній вузол зберігає агрегат (суму або мінімум) свого діапазону, обчислений з двох його дочірніх вузлів.
Побудова за O(n)
Побудова знизу вгору (або через рекурсивний поділ
«розділяй і володарюй») об'єднує n листків у
~2n вузлів загалом, виконуючи O(1)
роботи на вузол — тобто O(n) загалом.
Запит на діапазоні за O(log n)
Запит [L,R] рекурсивно спускається в діапазон
вузла: якщо він повністю поза [L,R] — пропускаємо;
якщо повністю всередині — використовуємо заздалегідь
обчислений агрегат вузла напряму; якщо частково
перетинається — рекурсивно заходимо в обидва дочірні вузли.
Загалом повністю комбінується щонайбільше
O(log n) вузлів, оскільки діапазон запиту
розкладається щонайбільше на два «ланцюжки» канонічних
піддіапазонів на кожному рівні дерева.
Точкове оновлення за O(log n)
Оновлення одного елемента масиву робить недійсними лише
O(log n) предків на шляху від цього листка до
кореня; кожен з них перераховується з двох своїх дочірніх
вузлів на шляху назад.
Чому не просто префіксні суми?
Префіксні суми відповідають на запит суми на діапазоні за
O(1), але потребують O(n) для
оновлення одного елемента і взагалі не підтримують запит
мінімуму на діапазоні (мінімум не має оберненої операції).
Дерево відрізків обмінює трохи швидкості запиту на швидкі
оновлення та підтримку будь-якого асоціативного
комбінатора.
Поза межами цієї симуляції
Лінива пропагація розширює дерева відрізків, щоб
підтримувати O(log n) оновлення на
діапазоні (а не лише точкові оновлення),
відкладаючи незастосовані оновлення на піддеревах, доки
вони справді не будуть відвідані.