Cod sursa(job #3167953)

Utilizator MAlex2019Melintioi George Alexandru MAlex2019 Data 11 noiembrie 2023 12:26:31
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int maxn = 15000;
int aint[4*maxn];

void update(int nod, int left, int right, int poz, int delta) {
    if (right == left) {
        aint[nod] += delta;
        return;
    }
    int mij = (left + right)/2;
    if (poz <= mij)
        update(nod*2, left, mij, poz, delta);
    else
        update(nod*2 + 1, mij + 1, right, poz, delta);
    aint[nod] = aint[nod*2] + aint[nod*2 + 1];
}

int query(int nod, int left, int right, int ql, int qr) {
    if (left == ql && right == qr)
        return aint[nod];
    int mij = (left + right)/2;
    if (qr <= mij)
        return query(nod*2, left, mij, ql, qr);
    if (ql > mij)
        return query(nod*2 + 1, mij + 1, right, ql, qr);
    return query(nod*2, left, mij, ql, mij) + query(nod*2 + 1, mij + 1, right, mij + 1, qr);
}

int main() {
    int n, m;
    fin >> n >> m;
    int aintn = 1;
    while (aintn < n)
        aintn <<= 1;
    for (int i = 0; i < n; i++)
        fin >> aint[aintn + i];
    for (int i = aintn - 1; i > 0; i--)
        aint[i] = aint[i*2] + aint[i*2 + 1];
    for (int i = 0; i < m; i++) {
        int a, b, c;
        fin >> a >> b >> c;
        if (a == 1)
            fout << query(1, 1, n, b, c) << '\n';
        else
            update(1, 1, n, b, -c);
    }

    return 0;
}