Cod sursa(job #183088)

Utilizator znakeuJurba Andrei znakeu Data 21 aprilie 2008 18:33:46
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
//datorii v1.0

#include <stdio.h>
#define MAXN 15005
#define MAXM 100005

int A[MAXN];
int p2[32], p1[MAXN];
int n,m;

inline void update(int p, int x)  
{  
    while ( p <= n )    
    {    
        A[p] += x;    
        p +=p1[p];  
    }  
}


inline int getsum(int p)  
{  
    int S=0;  
    while ( p > 0 )    
    {    
        S+=A[p];   
        p -=p1[p];  
    }  
    return S;  
}  

void preparations()  
{  
    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];          
    }  
}  
 

inline void parsare3 (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 citire()
{
	char s[MAXN*16]; int i,j,x;
	
	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';
	
	preparations();
	
	fgets(s,MAXN*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);
	}
}

void rezolvare()
{
	int t,x,y,i;
	
	for (i=0; i<m; i++)
	{
		parsare3(&t,&x,&y);
		
		if (t==0)
			update(x,(-1)*y);
		
		if (t==1)
			printf("%d\n",getsum(y)-getsum(x-1));
	}
}

int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	
	citire();
	rezolvare();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}