Cod sursa(job #2904718)

Utilizator tiberiusss26Titiriga Tiberiu Nicolae tiberiusss26 Data 18 mai 2022 00:49:25
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

vector<int> arb;

void update(int nod, int left, int right, int a, int b) {
    if (left == right) {
        if (b >= 0)
            arb[nod] = b;
        else
            arb[nod] += b;
        return;
    }

    int div = (left + right) / 2;
    if (a <= div) update(2 * nod, left, div, a, b);
    else update(2 * nod + 1, div + 1, right, a, b);

    if (arb[nod * 2] != 0)
        arb[nod] += arb[nod * 2];
    if (arb[nod * 2 + 1] != 0)
        arb[nod] += arb[nod * 2 + 1];

}


int query(int nod, int left, int right, int start, int finish) {
    if(right < start || left > finish )
        return 0;
    if (start <= left && right <= finish)
        return arb[nod];

    int div = (left + right) / 2;
    return query(2 * nod, left, div, start, finish) + query(2 * nod + 1, div + 1, right, start, finish);
}

int main() {
    int n, m, x, op, a, b;
    arb.resize(60066);

    fin >> n >> m;

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


    for (int i = 0; i < m; i++) {
        fin >> op;
        if (op == 1) {
            fin >> a >> b;
            fout << query(1, 1, n, a, b) << "\n";
        } else {
            fin >> a >> b;
            update(1, 1, n, a, (-1 * b));
        }
    }
}