Cod sursa(job #130118)

Utilizator TociToxAnonim Anonim TociTox Data 31 ianuarie 2008 12:03:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
//arbori indexati binar (clasic)   
#include<stdio.h>   
#define N 15001   
int m,n,a[N];   
int zero(int x){   
    int r=1;   
    while(!(x&1)){   
        x>>=1;   
        r<<=1;   
    }   
    return r;   
}   
void adauga(int i,int x){   
    while(i<=n){   
        a[i]+=x;   
        i+=zero(i);   
    }   
}   
int suma(int p){   
    int s=0;   
    while(p){   
        s+=a[p];   
        p-=zero(p);   
    }   
    return s;   
}   
void calcul(){   
    int i,x,tip,p,q,zi;   
    scanf("%d%d",&n,&m);   
    for(i=1;i<=n;++i){   
        scanf("%d",&x);   
        adauga(i,x);   
    }   
    /*  
    for(i=1;i<=n;++i)  
        printf("%d ",a[i]);  
    */  
    for(i=1;i<=m;++i){   
        scanf("%d",&tip);   
        if(tip){   
            scanf("%d%d",&p,&q);   
            printf("%d\n",suma(q)-suma(p-1));   
        }   
        else{   
            scanf("%d%d",&zi,&x);   
            adauga(zi,-x);   
        }   
    }   
}   
int main(){   
    freopen("datorii.in","r",stdin);   
    freopen("datorii.out","w",stdout);   
    calcul();   
    fclose(stdin);   
    fclose(stdout);   
    return 0;   
}