Cod sursa(job #361553)

Utilizator devilkindSavin Tiberiu devilkind Data 5 noiembrie 2009 19:58:18
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>

#define NMAX 16000

int N, M;
int A[NMAX];

class AIB {
    private:
        int size;
        int aib[NMAX];
        
        int lsb(int x) {
            return (x ^ (x - 1)) & x;
        }

    public:
        AIB(int N) {
            size = N;
            for (int i = 0; i <= N; i++) {
                aib[i] = 0;
            }
        }

        void add(int poz, int val) {
            for (; poz <= size; poz += lsb(poz)) {
                aib[poz] += val;
            }
        }

        int query(int poz) {
            int ret = 0;
            for (; poz > 0; poz -= lsb(poz) ) {
                ret = ret + aib[poz];
            }

            return ret;
        }

        int query_range(int a, int b) {
            int val_a, val_b;
            
            val_a = query(a - 1);
            val_b = query(b);

            return val_b - val_a;
        }
};

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

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

    AIB arb(N);

    for (int i = 1; i <= N; i++) {
        int x;
        scanf("%d ", &x);
        arb.add(i, x);
    }

    for (int i = 1; i <= M; i++) {
        int cod, x, y;
        scanf("%d %d %d ", &cod, &x, &y);

        if (cod == 1) {
            printf("%d\n", arb.query_range(x, y));
        } else {
            arb.add(x, -y);
        }
    }

    return 0;
}