Реализация запроса в дереве отрезков сверху — различия между версиями
Shagal (обсуждение | вклад) |
(→Реализация) |
||
Строка 9: | Строка 9: | ||
int sum (int v, int tl, int tr, int l, int r) | int sum (int v, int tl, int tr, int l, int r) | ||
{ | { | ||
− | if (l | + | if ([l,r] не пересекается с [tl, tr]) |
return 0; | return 0; | ||
if (l == tl && r == tr) | if (l == tl && r == tr) |
Версия 20:21, 16 мая 2011
Алгоритм
Будем рассматривать запрос на примере задачи RSQ(запрос суммы)
Обработка запроса суммы представляет собой рекурсивную функцию, которая всякий раз вызывает себя либо от левого сына, либо от правого (не изменяя границы запроса в обоих случаях), либо от обоих сразу (при этом деля наш запрос на два соответствующих подзапроса). Однако рекурсивные вызовы будем делать не всегда: если текущий запрос совпал с границами отрезка в текущей вершине дерева отрезков, то в качестве ответа будем возвращать предвычисленное значение суммы на этом отрезке, записанное в дереве отрезков.
Реализация
int sum (int v, int tl, int tr, int l, int r) { if ([l,r] не пересекается с [tl, tr]) return 0; if (l == tl && r == tr) return t[v]; int tm = (tl + tr) / 2; return sum (v*2, tl, tm, l, min(r,tm)) + sum (v*2+1, tm+1, tr, max(l,tm+1), r); }