Cod sursa(job #1091649)

Utilizator A63N7pTudor Nazarie A63N7p Data 25 ianuarie 2014 21:32:13
Problema Datorii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>

int dat[32768];

int query(int n, int left, int right, int a, int b);
void update(int n, int left, int right, int a, int b, int v);

int main(int argc, char *argv[])
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    int n, m;
    int i;
    scanf("%d%d", &n, &m);
    for (i = 0; i <= n; ++i) {
        int tmp;
        scanf("%d", &tmp);
        update(1, 1, n, i, i, tmp);
    }

    for (i = 0; i < m; ++i) {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        if (a) {
            int tmp = query(1, 1, n, b, c);
            printf("%d\n", tmp);
        } else
            update(1, 1, n, b, b, -c);
    }
    return 0;
}

int query(int n, int left, int right, int a, int b)
{
    if (a <= left && right <= b)
        return dat[n];
    int r = 0, middle = (left + right) / 2;
    if (a <= middle)
        r += query(2 * n, left, middle, a, b);
    if (b > middle)
        r += query(2 * n + 1, middle + 1, right, a, b);
    return r;
}

void update(int n, int left, int right, int a, int b, int v)
{
    if (a <= left && right <= b) {
        dat[n] += v;
        return;
    }
    int middle = (left + right) / 2;
    if (a <= middle)
        update(2 * n, left, middle, a, b, v);
    if (b > middle)
        update(2 * n + 1, middle + 1, right, a, b, v);
    dat[n] = dat[n * 2] + dat[n * 2 + 1];
}