Cod sursa(job #261748)

Utilizator ooctavTuchila Octavian ooctav Data 18 februarie 2009 19:10:45
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
// datorii.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <stdlib.h>
int e[15004];
int f[15004];
void schimbare(int n,FILE *f1)
{
	int i,k,i2,j; 
	f[0]=0;
	for(i=1;i<=n;i++)
	{
			fscanf(f1,"%d",&e[i]);
			if(i%2==0)
			{
				i2=i;
				k=1;
				while(i2%2==0)
				{
					i2=i2>>1;
					k=k<<1;
				}
				for(j=i-k+1;j<=i;j++)
					f[i]=f[i]+e[j];
			}
			else
				f[i]=e[i];
	}
}

			

int main()
{
	int i,n,m,iden,b,suma,j,a,a2,k,b2,sumad,sumas;
	FILE *f1,*f2;
	f1=fopen("datorii.in","r");
	f2=fopen("datorii.out","w");
	fscanf(f1,"%d %d",&n,&m);
	schimbare(n,f1);
	for(i=1;i<=m;i++)
	{
		fscanf(f1,"%d ",&iden);
		if(iden==1)
		{
			fscanf(f1,"%d %d",&a,&b);
			sumad=0;
			sumas=0;
			a--;
			while(a>0)
			{
				a2=a;
				k=1;
				while(a2%2==0)
				{
					a2=a2>>1;
					k=k<<1;
				}
				sumas=f[a]+sumas;
				a=a-k;
			}
			while(b>0)
			{
				b2=b;
				k=1;
				while(b2%2==0)
				{
					b2=b2>>1;
					k=k<<1;
				}
				sumad=f[b]+sumad;
				b=b-k;
			}
			suma=sumad-sumas;
			fprintf(f2,"%d\n",suma);

		}
		else
		{
			fscanf(f1,"%d %d",&a,&b);
			while(a<=n)
			{
				f[a]=f[a]-b;
				a2=a;
				k=1;
				while(a2%2==0)
				{
					a2=a2>>1;
					k=k<<1;
				}
				a=a+k;
			}
		}
			
	}
	fclose(f1);
	fclose(f2);
	return 0;
}