Cod sursa(job #2586003)

Utilizator copanelTudor Roman copanel Data 19 martie 2020 16:34:25
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <array>
#include <functional>

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

public:
    void update(int n, int poz, int val) {
        std::function<void(int,int,int)> _update = [&](int p, int st, int dr) {
            if (st == dr) {
                t[p] += val;
                return;
            }

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

        _update(1, 1, n);
    }

    int query(int n, int a, int b) {
        std::function<int(int, int, int)> _query = [&](int p, int st, int dr) {
            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);
            }
            if (b > m) {
                maxdr = _query(2 * p + 1, m + 1, dr);
            }
            return maxst + maxdr;
        };

        return _query(1, 1, n);
    }
};

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