Cod sursa(job #1474735)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 22 august 2015 18:49:15
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>

#define NMAX 16500
#define MMAX 100010

int N, M;
int v[NMAX], aint[NMAX];

void build (int node, int left, int right) { //node should have the answer for [left, right]
    if (left == right) {
        aint[node] = v[left];
        return;
    }

    int mid = (left + right) / 2;

    build (2 * node, left, mid);
    build (2 * node +1, mid + 1, right);

    aint[node] = aint[2 * node] + aint[2 * node + 1];
}

void update (int node, int left, int right, int pos, int val) { //minus val at position pos
    if (left == right) {
        aint[node] -= val;
        return;
    }

    int mid = (left + right) / 2;

    if (pos <= mid) {
        update (2 * node, left, mid, pos, val);
    }
    else {
        update (2 * node + 1, mid + 1, right, pos, val);
    }

    aint[node] = aint[2 * node] + aint[2 * node + 1];
}

int query (int node, int left, int right, int A, int B) {
    if (left >= A && right <= B) {
        return aint[node];
    }

    int mid = (left + right) / 2;
    int ans = 0;

    if (A <= mid) {
        ans += query (2 * node, left, mid, A, B);
    }
    if (B > mid) {
        ans += query (2 * node + 1, mid + 1, right, A, B);
    }

    return ans;
}

int main () {
    freopen ("datorii.in", "r", stdin);
    freopen ("datorii.out", "w", stdout);

    scanf ("%d%d", &N, &M);

    int np2 = 1;
    while (np2 < N) {
        np2 = np2 << 1;
    }

    for (int i = 1; i <= N; i++) {
        scanf ("%d", &v[i]);
    }
    build (1, 1, np2);

    int type, X, Y;
    while (M--) {
        scanf ("%d%d%d", &type, &X, &Y);

        if (type == 0) {
            update (1, 1, np2, X, Y);
        }
        else {
            int a = query (1, 1, np2, X, Y);
            printf ("%d\n", a);
        }
    }

    return 0;
}