SyntaxHighlighter

Monday 21 July 2014

Дерево отрезков с одиночной модификацией

Данная структура используется для быстрого поиска суммы, минимумма, максимума на диапозоне массива, в ситуациях когда предполагается изменение элемента массива по определенному индексу. Операция запроса и изменения имеют логарифмическую сложность от количества элементов в массиве.

#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;
    }
};

No comments:

Post a Comment