Cod sursa(job #2965048)

Utilizator mateilbMatei Balaur mateilb Data 14 ianuarie 2023 12:24:07
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#define int long long

using namespace std;

int aint[4 * 10000 + 5], sum = 0;
int v[15005];

struct interval {
    int st, dr;
};

void update(int nod, int poz, int val, interval x) {
    if(x.st == x.dr) {
        aint[nod] -= val;
        return;
    }
    int mij = (x.st + x.dr) / 2;

    if(poz <= mij)
        update(nod * 2, poz, val, {x.st, mij});
    if(poz > mij)
        update(nod * 2 + 1, poz, val, {mij + 1, x.dr});

    aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
    return;
}

void query(int nod, int st, int dr, interval x) {
    if(x.st == st && x.dr == dr) {
        sum += aint[nod];
        return;
    }
    int mij = (x.st + x.dr) / 2;
    if(st <= mij)
        query(nod * 2, st, min(mij, dr), {x.st, mij});
    if(dr >= mij + 1)
        query(nod * 2 + 1, max(mij + 1, st), dr, {mij + 1, x.dr});
    return;
}

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

    int n, m;
    cin>>n>>m;
    for(int i = 1; i <= n; i++) {
        cin>>v[i];
        update(1, i, -v[i], {1, n});
    }

    for(int i = 1; i <= m; i++) {
        int cer, a, b;
        cin>>cer>>a>>b;
        if(cer == 0)
            update(1, a, b, {1, n});
        if(cer == 1) {
            sum = 0;
            query(1, a, b, {1, n});
            cout<<sum<<'\n';
        }
    }
    return 0;
}