Cod sursa(job #928053)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 26 martie 2013 11:01:19
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

const int DMAX = 15005;
int p, q, A[DMAX], V[DMAX * 3];

void creare_arbore (int nod, int l, int r) {
    if(l == r) {
        V[nod] = A[l];
        return;
    }
    int m = (l + r) / 2;
    creare_arbore (2 * nod, l, m);
    creare_arbore (2 * nod + 1, m + 1, r);
    V[nod] = V[nod * 2] + V[nod * 2 + 1];
}

void updatare_arbore (int nod, int l, int r) {
    if(l == r) {
        V[nod] -= q;
        return;
    }
    int m = (l + r) / 2;
    if(p <= m)
        updatare_arbore (nod * 2, l, m);
    else
        updatare_arbore (nod * 2 + 1, m + 1, r);
    V[nod] = V[nod * 2] + V[nod * 2 + 1];
}

int querry_arbore (int nod, int l, int r) {
    if(l >= p && r <= q)
        return V[nod];
    if(p > r || q < l)
        return -1;
    int m = (l + r) / 2, a = querry_arbore (nod * 2, l, m), b = querry_arbore (nod * 2 + 1, m + 1, r);
    if(a != -1 && b != -1)
        return a + b;
    else
        if(a != -1 && b == -1)
            return a;
        else
            if(a == -1 && b != -1)
                return b;
            else
                return -1;
}

int main () {
    freopen ("datorii.in", "r", stdin); freopen ("datorii.out", "w", stdout);
    int N, M, i, op;
    scanf ("%d%d",&N, &M);
    for(i = 1; i <= N; ++i)
        scanf ("%d", &A[i]);
    creare_arbore (1, 1, N);
    while (M--) {
        scanf ("%d%d%d", &op, &p, &q);
        if(op)
            printf ("%d\n", querry_arbore (1, 1, N));
        else
            updatare_arbore (1, 1, N);
    }
}