Cod sursa(job #2586010)

Utilizator copanelTudor Roman copanel Data 19 martie 2020 16:42:59
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <array>

template<int len>
class AINT {
    std::array<int, (len << 2) + 1> t;

private:
    void _update(int p, int st, int dr, int poz, int val) {
        if (st == dr) {
            t[p] += val;
            return;
        }

        int m = (st + dr) / 2;
        if (poz <= m) {
            _update(2 * p, st, m, poz, val);
        } else {
            _update(2 * p + 1, m + 1, dr, poz, val);
        }
        t[p] = t[2 * p] + t[2 * p + 1];
    }

    int _query(int p, int st, int dr, int a, int b) {
        if (a <= st && b >= dr) {
            return t[p];
        }

        int m = (st + dr) / 2, maxst = 0, maxdr = 0;
        if (a <= m) {
            maxst = _query(2 * p, st, m, a, b);
        }
        if (b > m) {
            maxdr = _query(2 * p + 1, m + 1, dr, a, b);
        }
        return maxst + maxdr;
    }

public:
    inline void update(int n, int poz, int val) {
        _update(1, 1, n, poz, val);
    }

    inline int query(int n, int a, int b) {
        return _query(1, 1, n, a, b);
    }
};

AINT<15000> aint;

int main() {
    std::ifstream fin("datorii.in");
    std::ofstream fout("datorii.out");
    int n, m;

    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int x;
        fin >> x;
        aint.update(n, i, x);
    }

    for (; m > 0; m--) {
        int c, a, b;
        fin >> c >> a >> b;
        if (c == 0) {
            aint.update(n, a, -b);
        } else {
            fout << aint.query(n, a, b) << '\n';
        }
    }

    return 0;
}