Cod sursa(job #2693353)

Utilizator cyg_dawidDavid Ghiberdic cyg_dawid Data 5 ianuarie 2021 16:27:31
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>

using namespace std;

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

int const nmax = 15000;
int aint[4 * nmax + 5];
int v[nmax + 5];

int query(int node, int st, int dr, int l, int r) {
    if(l <= st && dr <= r)
        return aint[node];
    int med = (st + dr) >> 1;
    int sum = 0;
    if(l <= med)
        sum += query((node << 1), st, med, l, r);
    if(med < r)
        sum += query((node << 1) + 1, med + 1, dr, l, r);
    return sum;
}

void update(int node, int st, int dr, int poz, int val) {
    if(st == dr) {
        aint[node] -= val;
        return;
    }
    int med = (st + dr) >> 1;
    if(poz <= med)
        update((node << 1), st, med, poz, val);
    else
        update((node << 1) + 1, med + 1, dr, poz, val);
    aint[node] = aint[(node << 1)] + aint[(node << 1) + 1];
}

int cnt;
void build(int nod, int st, int dr) {
    if(st == dr) {
        aint[nod] = v[++cnt];
        return;
    }
    int med = (st + dr) >> 1;
    build((nod << 1), st, med);
    build((nod << 1) + 1, med + 1, dr);
    aint[nod] = aint[(nod << 1)] + aint[(nod << 1) + 1];
}

int main()
{
    int n, m;
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    build(1, 1, n);
    while(m--) {
        int tip, zi, val;
        fin >> tip >> zi >> val;
        if(tip == 0)
            update(1, 1, n, zi, val);
        else
            fout << query(1, 1, n, zi, val) << "\n";
    }
    return 0;
}