Cod sursa(job #903027)

Utilizator Teodor94Teodor Plop Teodor94 Data 1 martie 2013 18:08:10
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <cassert>

#define MAX_N 15001

int n, q;
int v[MAX_N];
int aib[MAX_N];

void read() {
    assert(scanf("%d%d", &n, &q) == 2);

    for (int i = 1; i <= n; ++i)
        assert(scanf("%d", &v[i]) == 1);
}

inline int put2(int x) {
    return (x ^ (x - 1)) & x;
}

void init() {
    for (int i = 1; i <= n; ++i) {
        aib[i] += v[i];

        if (i + put2(i) <= n)
            aib[i + put2(i)] += aib[i];
    }
}

inline void update(int pos, int val) {
    for (int i = pos; i <= n; i += put2(i))
        aib[i] -= val;
}

inline int query(int pos) {
    int sum = 0;
    for (int i = pos; i > 0; i -= put2(i))
        sum += aib[i];

    return sum;
}

void solve() {
    while (q) {
        --q;

        int type, a, b;
        assert(scanf("%d%d%d", &type, &a, &b) == 3);

        if (type == 0)
            update(a, b);
        else
            printf("%d\n", query(b) - query(a - 1));
    }
}

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

    read();

    init();

    solve();
}