Cod sursa(job #3144365)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 7 august 2023 16:33:31
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n, q, i, a[60002], v[15002], poz, val, qx, qy, op;

static inline void setUp(int nod, int st, int dr) {
    if(st == dr) a[nod] = v[st];
    else {
        int mij = (st + dr) / 2;
        setUp(nod * 2, st, mij);
        setUp(nod * 2 + 1, mij + 1,  dr);
        a[nod] = a[nod * 2] + a[nod * 2 + 1];
    }
}

static inline void update(int nod, int st, int dr) {
    if(st == dr) a[nod] -= val;
    else {
        int mij = (st + dr) / 2;

        if(poz <= mij) update(nod * 2, st, mij);
        else update(nod * 2 + 1, mij + 1, dr);

        a[nod] = a[nod * 2] + a[nod * 2 + 1];
    }
}

static inline int query(int nod, int st, int dr) {
    if(qx <= st && dr <= qy) return a[nod];
    else {
        int mij = (st + dr) / 2;
        if(qy <= mij) return query(nod * 2, st, mij);
        if(mij + 1 <= qx) return query(nod * 2 + 1, mij + 1, dr);

        return query(nod * 2, st, mij) +
               query(nod * 2 + 1, mij + 1, dr);
    }
}

int main() {
    fin >> n >> q;
    for(i = 1; i <= n; i++) fin >> v[i];
    setUp(1, 1, n);
    while(q--) {
        fin >> op;
        if(op == 1) {
            fin >> qx >> qy;
            fout << query(1, 1, n) << "\n";
        }
        else {
            fin >> poz >> val;
            update(1, 1, n);
        }
    }

    return 0;
}