Cod sursa(job #122902)

Utilizator pikuAnca Miihai piku Data 13 ianuarie 2008 21:34:09
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>

int n, m, a[15010], q;

void update(int i, int n) {
    int j = (1<<q) + i;
    a[j]+=n;
    while(j!=1) {
        j/=2;
        a[j]+=n;
    }
    
}

int query(int n, int st, int dr, int x, int y) {
    if(x <= st && dr <= y)
        return a[n];
    int s=0, m=(st+dr)/2;
    if(x<=m)
        s=query(n*2, st, m, x, y);
    if(m<y)
        s+=query(n*2+1, m+1, dr, x, y);
    return s;
}

void citeste() {
    int i, x;
    for(i=0; i<n; i++) {
        scanf("%d", &x);
        update(i, x);
    }
    
}

void print() {
    int i;
    for(i=0; i<1<<(q+1); i++)
        printf("%d ", a[i]);
    printf("\n");
}

int main() {
    
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    
    scanf("%d %d", &n, &m);
    
    int i=1;
    q=0;
    while(i<<q < n)
        q++;
    
    citeste();
//    print();
//    printf("%d %d %d", 3, 6, query(1, 1, 1<<(q+1)-1, 1, 4));
    int j, k, l;
    for(i=0; i<m; i++)
    {
        scanf("%d %d %d", &j, &k, &l);
        if(j==0)
            update(k-1, -l);
        else
            printf("%d\n", query(1, 1, 1<<(q+1)-1, k, l));
    }
    
    return 0;
}