Cod sursa(job #2612197)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 8 mai 2020 16:34:36
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>

using namespace std;

ifstream cin ("datorii.in");
ofstream cout ("datorii.out");

const int NMAX = 15000;
int v[NMAX + 1], aint[4 * NMAX + 1];

int n;

void build(int node, int l, int r) {
    if (l > r)
        return;
    if (l == r) {
        aint[node] = v[l];
        return;
    }
    int mid = (l + r) / 2;
    build(2 * node, l, mid);
    build(2 * node + 1, mid + 1, r);
    aint[node] = aint[2 * node] + aint[2 * node + 1];
}

void update(int node, int l, int r, int poz, int val) {
    if (l > r || poz < l || poz > r)
        return;
    if (l == r) {
        aint[node] -= val;
        return;
    }
    int mid = (l + r) / 2;
    update(2 * node, l, mid, poz, val);
    update(2 * node + 1, mid + 1, r, poz, val);
    aint[node] = aint[2 * node] + aint[2 * node + 1];
}

int query(int node, int l, int r, int ql, int qr) {
    if (l > r || qr < l || ql > r) //nu e inclus deloc
        return 0; //nu infl val
    if (ql <= l && qr >= r) //e inclus total
        return aint[node];
    int mid = (l + r) / 2;
    int sumst = query(2 * node, l, mid, ql, qr);
    int sumdr = query(2 * node + 1, mid + 1, r, ql, qr);
    return sumst + sumdr;
}

int main() {

    int m, i, op, a, b;

    cin >> n >> m;
    for (i = 1; i <= n; i++)
        cin >> v[i];
    build(1, 1, n);

    for (i = 1; i <= m; i++) {
        cin >> op >> a >> b;
        if (op == 1)
            cout << query(1, 1, n, a, b) << '\n';
        else
            update(1, 1, n, a, b);
    }

    return 0;
}