Cod sursa(job #526218)

Utilizator SadmannCornigeanu Calin Sadmann Data 27 ianuarie 2011 19:29:05
Problema Datorii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
FILE *in,*out;
int tip,poz,val,C[15001],i,n,m,k,aux,dr,st;

void schimba(int poz, int val)
{
	while(poz<=n)
	{
		C[poz]-=val;
		k=0;
		aux=poz;
		while( !(aux%2) )
		{
			k++;
			aux=aux >> 1;
		}
		poz+=(1 << k);
	}
}

void interogare(int st, int dr)
{
	int sumast=0,sumadr=0;
	st--;
	while(st>0)
	{
		sumast+=C[st];
		aux=st;
		k=0;
		while( !(aux%2) )
		{
			k++;
			aux=aux >> 1;
		}
		st-= (1 << k);
	}
	
	while(dr>0)
	{
		sumadr+=C[dr];
		aux=dr;
		k=0;
		while( !(aux%2) )
		{
			k++;
			aux=aux >> 1;
		}
		dr-= (1 << k);
	}
	fprintf(out,"%d\n",sumadr-sumast);
}

int main()
{
	in=fopen("datorii.in","rt");
	out=fopen("datorii.out","wt");
	fscanf(in,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		fscanf(in,"%d",&val);
		schimba(i,-val);
	}
	
	
	for(i=1;i<=m;i++)
	{
		fscanf(in,"%d",&tip);
		if( !tip )
		{
			fscanf(in,"%d %d",&poz,&val);
			schimba(poz,val);
		}
		else
		{
			fscanf(in,"%d %d",&st,&dr);
			interogare(st,dr);
		}
		
	}
	
	return 0;
}