Cod sursa(job #195605)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 20 iunie 2008 08:15:57
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#define N 2005
int A[N];
int p2[32],p1[N];
int n,m;
inline void update(int p,int x){
    while(p<=n){
        A[p]+=x;
        p+=p1[p];
    }
}
inline int sum(int p){
    int S=0;
    while(p>0){
        S+=A[p];
        p-=p1[p];
    }
    return S;
}
void prep(){
    int i,k=0;
    p2[0]=1;
    for(i=1;i<=25;++i)
        p2[i]=p2[i-1]<<1;
    for(i=1;i<=n;++i){
        k=0;
        while(!(i&p2[k]))
            k++;
        p1[i]=p2[k];
    }
}
void funct(int *a, int *b, int *c){
    char s[64];
	int j=0,x=0,y=0,z=0;
    fgets(s,64,stdin);
    while(s[j]>='0'&&s[j]<='9')
        x=x*10+s[j++]-'0';
    j++;
    while(s[j]>='0'&&s[j]<='9')
        y=y*10+s[j++]-'0';
    j++;
    while(s[j]>='0'&&s[j]<='9')
        z=z*10+s[j++]-'0';
    *a=x;
	*b=y;
	*c=z; 
}
void solve(){
    int t,x,y,i;
    for(i=0;i<m;++i){
        funct(&t,&x,&y);
        if(t==0)
            update(x,(-1)*y);
        if(t==1)
            printf("%d\n",sum(y)-sum(x-1));
    }
}
int main(){
	char s[N*16];
	int i,j,x;
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
	fgets(s,64,stdin);
    n=0;
	m=0;
	j=0;
    while(s[j]>='0'&&s[j]<='9')
        n=n*10+s[j++]-'0';
    j++;
    while(s[j]>='0'&&s[j]<='9')
        m=m*10+s[j++]-'0';
    prep();
    fgets(s,N*16,stdin);
    for(i=1,j=0;i<=n;++i,++j){
        x=0;
        while(s[j]>='0'&&s[j]<='9')
            x=x*10+s[j++]-'0';
        update(i,x);
    }
    solve();
    fclose(stdin);
    fclose(stdout);
    return 0;
}