Cod sursa(job #599078)

Utilizator vlad2901Vlad Berindei vlad2901 Data 27 iunie 2011 21:57:26
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>

#define NMAX 15000

short a[NMAX], n;
int m;

int secv(int n) { //suma 1...n
    int sum = 0, curent, nr, aux;

    curent = n;

    while(curent > 0) {
        sum += a[curent];
        //numar cati de 0 are la sfarsit
        nr = 0;
        aux = curent;
        while(aux % 2 == 0) {
            aux = aux>>1;
            nr++;
        }
        curent -= 1<<nr;
    }
    return sum;

}

void add(int poz, int val) {
    int curent, aux, nr;
    curent = poz;
    while(curent <= n) {
        a[curent] += val;
        //numar cati de 0 are la sfarsit
        nr = 0;
        aux = curent;
        while(aux % 2 == 0) {
            aux = aux>>1;
            nr++;
        }
        curent += 1<<nr;
    }
}

int main() {

    int i, x, curent, nr, op, p1, p2;

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

    scanf("%d %d", &n, &m);

    for(i=1;i<=n;++i) {
        scanf("%d", &x);
        add(i, x);
    }

    for(i=0;i<m;++i) {
        scanf("%d %d %d", &op, &p1, &p2);

        if(op == 0) {
                add(p1, -p2);
            } else {
                if(p1 == 1) {
                    printf("%d\n", secv(p2));
                } else {
                    printf("%d\n", secv(p2) - secv(p1-1));
                }
            }
        }


    return 0;
}