Cod sursa(job #526208)

Utilizator SadmannCornigeanu Calin Sadmann Data 27 ianuarie 2011 19:13:26
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
#include<math.h>
FILE *in,*out;
int V[15001],tip,poz,val,C[15001],i,n,m,k,aux;
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",&V[i]);
	for(i=1;i<=n;i++)
	{
		k=0,aux=i;
		while( !(aux%2) )
		{
			k++;
			aux/=2;
		}
		int q=pow(2,k);
		for(int j=i-q+1;j<=i;j++)
			C[i]+=V[j];
	}
	
	for(i=1;i<=m;i++)
	{
		fscanf(in,"%d",&tip);
		if( !tip )
		{
			fscanf(in,"%d %d",&poz,&val);
			while(poz<=n)
			{
				C[poz]-=val;
				k=0;
				aux=poz;
				while( !(aux%2) )
				{
					k++;
					aux/=2;
				}
				poz+=pow(2,k);
			}
			
		}
		else
		{
			int st=0,dr=0,sumast=0,sumadr=0;
			fscanf(in,"%d %d",&st,&dr);
			st--;
			while(st>0)
			{
				sumast+=C[st];
				aux=st;
				k=0;
				while( !(aux%2) )
				{
					k++;
					aux/=2;
				}
				st-=pow(2,k);
			}
			
			while(dr>0)
			{
				sumadr+=C[dr];
				aux=dr;
				k=0;
				while( !(aux%2) )
				{
					k++;
					aux/=2;
				}
				dr-=pow(2,k);
			}
			fprintf(out,"%d\n",sumadr-sumast);
		}
	}
	
	return 0;
}