333
правки
Изменения
→Псевдокод
==Псевдокод==
Используется классическая реализация дерева отрезка с полуинтервалами.
get_min(vint node, lint a, rint b) { // v node - текущая вершина, l a и r b - границы запроса l = tree[node].left; r = tree[node].right; if (отрезок соответствующий v не пересекается с [l, r])<tex>\bigcap </tex>[a, b) == <tex> \varnothing</tex> return inf /<tex>\infty</ бесконечность - нейтральный элемент относительно mintex>; if (отрезок соответствующий v содержится в [l, r]) == [a, b) return tree[vnode] .min + dtree[vnode].d; // Раздаем "проталкиваем" несогласованность детям d tree[2 * v node + 1] .d += dtree[2 * v + 1node] + .d[v]; d tree[2 * v node + 2] .d += dtree[2 * v + 2node] + .d; tree[vnode] .d[v] = 0; int m = (l + r) // Вызываем функцию от детей2; int ans = min(get_min(node * 2 * v + 1, la, min(b, rm)), get_min(node * 2 * v + 2, lmax(a, m), rb))); // Пересчитываем свое значение T tree[vnode] .min = min(T[2 * v + 1] + d[2 * v + 1], T[2 * v + 2] + d[2 * v + 2])ans; return ans;
}