Дерево отрезков
Суммы/минимумы на любом диапазоне из 2-3 готовых узлов.
1class SegmentTree {2 private n: number3 private sum: number[] // узел i покрывает диапазон4 5 constructor(values: number[]) {6 this.n = values.length7 this.sum = new Array(2 * this.n).fill(0)8 for (let i = 0; i < this.n; i++) this.sum[this.n + i] = values[i]!9 for (let i = this.n - 1; i > 0; i--) {10 this.sum[i] = this.sum[2 * i]! + this.sum[2 * i + 1]!11 }12 }13 14 rangeSum(l: number, r: number): number { // [l, r)15 let res = 016 for (l += this.n, r += this.n; l < r; l >>= 1, r >>= 1) {17 if (l & 1) res += this.sum[l++]!18 if (r & 1) res += this.sum[--r]!19 }20 return res21 }22 23 update(i: number, value: number): void {24 let pos = i + this.n25 this.sum[pos] = value26 for (pos >>= 1; pos > 0; pos >>= 1) {27 this.sum[pos] = this.sum[2 * pos]! + this.sum[2 * pos + 1]!28 }29 }30}Проблема
Суммы/минимумы на любом диапазоне из 2-3 готовых узлов.
Что вы видите
Узел = сумма отрезка; запрос спускается и склеивает куски.
Как это работает
Итеративная реализация: дерево в массиве 2n, запрос [l,r) идёт снизу вверх. Обновление поднимается от листа. Любая ассоциативная операция.
Пошаговый разбор
- 01
Листья
Элементы внизу.
- 02
Родители
Суммы половинок.
- 03
Запрос
Куски слева и справа.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Статистика
Скользящие метрики.
Игры
Урон по области.
БД
Range-агрегаты.
Связанные алгоритмы
«RMQ/RSQ из пары узлов»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.