Изменения

Перейти к: навигация, поиск
Псевдокод
int get_min(int node, int a, int b) {
// node - текущая вершина, a и b - границы запроса
l = tree[node].left;
return ans;
}
void update(int node, int a, int b, int val) {
// val - значение, на которое нужно увеличить отрезок
l = tree[node].left;
r = tree[node].right;
if [l, r)<tex>\bigcap </tex>[a, b) == <tex> \varnothing</tex>
return;
if [l, r) == [a, b)
tree[node].d += val;
return;
update(v, l, r, x) { // x - сколько нужно прибавить на отрезке if (отрезок соответственный v не пересекается с [l, r]) return if (отрезок соответственный v содержится в [l, r]) { d[v] = d[v] + x return } // Раздаем детям 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; // Вызываем функцию от обновление детей update(2 * v node + 1, la, rb, xval); update(2 * v node + 2, la, rb, xval);
// Пересчитываем свое значение
T tree[vnode] .min = min(Ttree[2 * v node + 1] .min + dtree[2 * v node + 1].d, T tree[2 * v node + 2] .min + dtree[2 * v node + 2].d);
}
333
правки

Навигация