Cod sursa(job #935815)

Utilizator mvcl3Marian Iacob mvcl3 Data 4 aprilie 2013 20:38:17
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#define MAX_SIZE (1 << 15) + 9
using namespace std;

ifstream f("datorii.in"); ofstream g("datorii.out");

int n, m, poz, val, a, b, t, suma, MaxArb[MAX_SIZE];
int start,  finish;

void update(int, int, int);
void query(int, int, int);

int main() {
    f >> n >> m;
    for(int i = 1; i <= n; ++i) {
        f >> val;
        poz = i;
        update(1, 1, n);
    }

    for(int i = 1; i <= m; ++i) {
        f >> t >> a >> b;
        if(t) {
            suma = 0;
            start = a, finish = b;
            query(1, 1, n);
            g << suma << '\n';
        }
        else {
            poz = a, val = -b;
            update(1, 1, n);
        }
    }
}

void update(int nod, int st, int dr) {
    if(st == dr) {
        MaxArb[nod] += val;
        return;
    }

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

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

void query(int nod, int st, int dr) {
    if(start <= st && dr <= finish) {
        suma += MaxArb[nod];
        return;
    }

    int m = (st + dr) >> 1;
    if(start <= m) query(2 * nod, st, m);
    if(finish > m) query(2 * nod + 1, m + 1, dr);
}