Cod sursa(job #2401408)

Utilizator MateiTrandafirMatei Trandafir MateiTrandafir Data 9 aprilie 2019 18:07:39
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <fstream>

int tree[1 << 15], n, m, pos, val, a, b;

void update(int p, int st, int dr) {
    if (st == dr) tree[p] -= val;
    else {
        int m = (st + dr) / 2;
        if (pos <= m) update(2 * p, st, m);
        else update(2 * p + 1, m + 1, dr);
        tree[p] = tree[2 * p] + tree[2 * p + 1];
    }
}

int query(int p, int st, int dr) {
    if (a <= st && dr <= b) return tree[p];
    int m = (st + dr) / 2, r1 = 0, r2 = 0;
    if (a <= m) r1 = query(2 * p, st, m);
    if (m < b)  r2 = query(2 * p + 1, m + 1, dr);
    return r1 + r2;
}

int main() {
    std::ifstream in("datorii.in");
    std::ofstream out("datorii.out");
    int i, x;
    in >> n >> m;
    for (pos = 1; pos <= n; ++pos) {
        in >> val;
        val = - val;
        update(1, 1, n);
    }
    for (i = 0; i < m; ++i) {
        in >> x >> a >> b;
        if (x == 1) out << query(1, 1, n) << '\n';
        else {
            pos = a;
            val = b;
            update(1, 1, n);
        }
    }
    return 0;
}