#define OP(x, y) ((x) + (y)) #define NEUTRAL (0) struct SegmentTree { vi q; int n; SegmentTree(int size = 0) { while (size & (size - 1)) ++size; // it is not required n = size; q = vi(2 * n, NEUTRAL); } void clear() { fill(all(q), NEUTRAL); } void set(int p, int val) { for (p += n; p; p >>= 1) { q[p] = OP(q[p], val); } } int get(int lo, int hi) { int res = 0; for (lo += n, hi += n; lo <= hi; ++lo >>= 1, --hi >>= 1) { if ((lo & 1) == 1) res = OP(res, q[lo]); if ((hi & 1) == 0) res = OP(res, q[hi]); } return res; } };
SyntaxHighlighter
Monday, 21 July 2014
Дерево отрезков с одиночной модификацией
Данная структура используется для быстрого поиска суммы, минимумма, максимума на диапозоне массива, в ситуациях когда предполагается изменение элемента массива по определенному индексу. Операция запроса и изменения имеют логарифмическую сложность от количества элементов в массиве.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment