Дерево отрезков: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 15: | Строка 15: | ||
int query(int v, int vl, int vr, int l, int r) { | int query(int v, int vl, int vr, int l, int r) { | ||
if (l | if (r < vl || vr < l) | ||
return 0; | return 0; | ||
if (vl | if (l <= vl && vr <= r) | ||
return t[v]; | return t[v]; | ||
int vm = vl + (vr - vl) / 2; | int vm = vl + (vr - vl) / 2; | ||
int ql = query(2 * v + 1, vl, vm, l, | int ql = query(2 * v + 1, vl, vm, l, r); | ||
int qr = query(2 * v + 2, vm + 1, vr, | int qr = query(2 * v + 2, vm + 1, vr, l, r); | ||
return ql + qr; | return ql + qr; | ||
} | } | ||
void modify(int v, int vl, int vr, int pos, int val) { | void modify(int v, int vl, int vr, int pos, int val) { | ||
if (vl == vr) { | if (pos < vl || vr < pos) | ||
return; | |||
if (pos == vl && vl == vr) { | |||
t[v] += val; | t[v] += val; | ||
return; | return; | ||
} | } | ||
int vm = vl + (vr - vl) / 2; | int vm = vl + (vr - vl) / 2; | ||
modify(2 * v + 1, vl, vm, pos, val); | |||
modify(2 * v + 2, vm + 1, vr, pos, val); | |||
t[v] = t[2 * v + 1] + t[2 * v + 2]; | t[v] = t[2 * v + 1] + t[2 * v + 2]; | ||
} | } | ||
Строка 63: | Строка 63: | ||
int query(int v, int vl, int vr, int l, int r) { | int query(int v, int vl, int vr, int l, int r) { | ||
if (l | if (r < vl || vr < l) | ||
return 0; | return 0; | ||
push(v, vl, vr); | push(v, vl, vr); | ||
if (vl | if (l <= vl && vr <= vr) | ||
return t[v] | return t[v]; | ||
int vm = vl + (vr - vl) / 2; | int vm = vl + (vr - vl) / 2; | ||
int ql = query(2 * v + 1, vl, vm, l, | int ql = query(2 * v + 1, vl, vm, l, r); | ||
int qr = query(2 * v + 2, vm + 1, vr, | int qr = query(2 * v + 2, vm + 1, vr, l, r); | ||
return ql + qr; | return ql + qr; | ||
} | } | ||
void modify(int v, int vl, int vr, int l, int r, int val) { | void modify(int v, int vl, int vr, int l, int r, int val) { | ||
if (l | if (r < vl || vr < l) | ||
return; | return; | ||
push(v, vl, vr); | push(v, vl, vr); | ||
if (vl | if (l <= vl && vr <= vr) { | ||
add[v] += val; | add[v] += val; | ||
return; | return; | ||
} | } | ||
int vm = vl + (vr - vl) / 2; | int vm = vl + (vr - vl) / 2; | ||
modify(2 * v + 1, vl, vm, l, | modify(2 * v + 1, vl, vm, l, r, val); | ||
modify(2 * v + 2, vm + 1, vr, | modify(2 * v + 2, vm + 1, vr, l, r, val); | ||
//t[v] = (t[2 * v + 1] + add[2 * v + 1] * (vm - vl + 1)) + (t[2 * v + 2] + add[2 * v + 2] * (vr - vm)); | //t[v] = (t[2 * v + 1] + add[2 * v + 1] * (vm - vl + 1)) + (t[2 * v + 2] + add[2 * v + 2] * (vr - vm)); | ||
int ql = query(2 * v + 1, vl, vm, vl, vm); | int ql = query(2 * v + 1, vl, vm, vl, vm); |
Версия от 18:46, 10 октября 2014
Запрос на отрезке и модификация отдельных элементов
int t[4 * 100010]; void build(int v, int vl, int vr, int a[]) { if (vl == vr) { t[v] = a[vl]; return; } int vm = vl + (vr - vl) / 2; build(2 * v + 1, vl, vm, a); build(2 * v + 2, vm + 1, vr, a); t[v] = t[2 * v + 1] + t[2 * v + 2]; } int query(int v, int vl, int vr, int l, int r) { if (r < vl || vr < l) return 0; if (l <= vl && vr <= r) return t[v]; int vm = vl + (vr - vl) / 2; int ql = query(2 * v + 1, vl, vm, l, r); int qr = query(2 * v + 2, vm + 1, vr, l, r); return ql + qr; } void modify(int v, int vl, int vr, int pos, int val) { if (pos < vl || vr < pos) return; if (pos == vl && vl == vr) { t[v] += val; return; } int vm = vl + (vr - vl) / 2; modify(2 * v + 1, vl, vm, pos, val); modify(2 * v + 2, vm + 1, vr, pos, val); t[v] = t[2 * v + 1] + t[2 * v + 2]; }
Запрос на отрезке и модификация на отрезке
int t[4 * 100010], add[4 * 100010]; void push(int v, int vl, int vr) { if (vl != vr) { add[2 * v + 1] += add[v]; add[2 * v + 2] += add[v]; } t[v] += add[v] * (vr - vl + 1); add[v] = 0; } void build(int v, int vl, int vr, int a[]) { if (vl == vr) { t[v] = a[vl]; return; } int vm = vl + (vr - vl) / 2; build(2 * v + 1, vl, vm, a); build(2 * v + 2, vm + 1, vr, a); t[v] = t[2 * v + 1] + t[2 * v + 2]; } int query(int v, int vl, int vr, int l, int r) { if (r < vl || vr < l) return 0; push(v, vl, vr); if (l <= vl && vr <= vr) return t[v]; int vm = vl + (vr - vl) / 2; int ql = query(2 * v + 1, vl, vm, l, r); int qr = query(2 * v + 2, vm + 1, vr, l, r); return ql + qr; } void modify(int v, int vl, int vr, int l, int r, int val) { if (r < vl || vr < l) return; push(v, vl, vr); if (l <= vl && vr <= vr) { add[v] += val; return; } int vm = vl + (vr - vl) / 2; modify(2 * v + 1, vl, vm, l, r, val); modify(2 * v + 2, vm + 1, vr, l, r, val); //t[v] = (t[2 * v + 1] + add[2 * v + 1] * (vm - vl + 1)) + (t[2 * v + 2] + add[2 * v + 2] * (vr - vm)); int ql = query(2 * v + 1, vl, vm, vl, vm); int qr = query(2 * v + 2, vm + 1, vr, vm + 1, vr); t[v] = ql + qr; }