Fenwick/Segment tree на Python: как решать + 4 задачи с проверкой

Fenwick tree (дерево Фенвика) и Segment tree (дерево отрезков) — это способы хранить массив так, чтобы быстро делать много запросов и изменений. В олимпиадных задачах они появляются, когда есть длинный список значений (секции конвейера, фонари на улице, сила игроков) и поток операций: «прибавь в позиции i», «узнай сумму на префиксе/отрезке», «найди минимум/максимум», «посчитай количество инверсий».

Как распознать, что нужно именно это:

Суть приёма: вместо пересчёта целого отрезка мы храним агрегаты (например, суммы) в вершинах дерева. Обновление затрагивает только O(log n) вершин, и запрос тоже собирается из O(log n) кусочков. Fenwick — самый компактный вариант для префиксных сумм и точечных обновлений; segment tree — более универсален (любой «склеиваемый» ответ: сумма, минимум, максимум, количество, а с доп. идеями — и ленивые обновления).

С чего начать учиться:

Ниже — задачи с автопроверкой и разбором подхода: начнём с префиксных сумм через Fenwick и перейдём к более общим запросам через segment tree.

Задачи по теме «Fenwick/Segment tree»

Смежные темы

Весь каталог задач

Куда дальше