Cod sursa(job #61658)

Utilizator mastermageSchneider Stefan mastermage Data 20 mai 2007 11:40:50
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <stdio.h>

#define forn(i,n) for(int i=0;i<n;i++)
#define maxN 66000

FILE*fi,*fo;

int n,m,vec[maxN],umsk;

void inputFunc(){
	fi=fopen("datorii.in","r"),fo=fopen("datorii.out","w");
	fscanf(fi,"%d %d",&n,&m);
	umsk=1;for(int j=n;j;j>>=1)umsk<<=1;
	forn(i,n)fscanf(fi,"%d",&vec[umsk+i]);
}

void outputFunc(){
	fclose(fi);fclose(fo);
}

int l2(int x){
	int res=0;
	while(x)res++,x>>=1;
	return res;
}

int main(){
	for(int i=0;i<60000;i++)vec[i]=vec[i-1];
	inputFunc();
	for(int i=n+umsk-1;i>1;i--)vec[i>>1]+=vec[i];
	
	forn(q,m){
		int op,x,y;
		fscanf(fi,"%d %d %d",&op,&x,&y);
		if(op){
			x=x+umsk-1,y=y+umsk-1;		
			int sum=vec[y]+vec[x];
			
			
			for(int tx=x>>1,ty=y>>1; tx!=ty; x=tx,y=ty,tx>>=1,ty>>=1){
				if(!(x&1))sum+=vec[x+1];
				if(y&1)sum+=vec[y^1];
			}
			
			fprintf(fo,"%d\n",sum);
			
		}else{
			for(x=x+umsk-1;x;x>>=1)vec[x]-=y;
		}
	}
	
	
	outputFunc();
	return 0;
}