Cod sursa(job #73333)

Utilizator vlad3rsterian vladut vlad3r Data 17 iulie 2007 20:00:33
Problema Datorii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <conio.h>

#include <stdlib.h>



int main() 
{ 
FILE *out,*in;
long c[15001];
long n,i,ind,val,poz;
long rez,s1,s2;
long cate,j,st,dr;
int op;

out=fopen("datorii.out","w");
in=fopen("datorii.in","r");

fscanf(in,"%ld",&n);
fscanf(in,"%ld",&cate);
for (i=0;i<=n;i++)
	c[i]=0;
for(i=1;i<=n;i++)
	{
	ind=i;
	fscanf(in,"%ld",&val);
	poz=0;
	while(ind<=n)
		{
		c[ind]=c[ind]+val;
		rez=ind&(long)pow(2,poz);
		while(rez==0)
			{
			poz=poz+1;
			rez=ind&(long)pow(2,poz);
			}
		ind=ind+pow(2,poz);
		poz=poz+1;
		}
	}


//for(i=1;i<=n;i++)
//	fprintf(out,"%d ",c[i]);

for(i=1;i<=cate;i++)
	{
	fscanf(in,"%d",&op);
if(op==0)
	{
	fscanf(in,"%ld",&ind);
	fscanf(in,"%ld",&val);
	poz=0;
	while(ind<=n)
		{
		c[ind]=c[ind]-val;
		rez=ind&(long)pow(2,poz);
		while(rez==0)
			{
			poz=poz+1;
			rez=ind&(long)pow(2,poz);
			}
		ind=ind+pow(2,poz);
		poz=poz+1;
		}
	}
else
	{
	fscanf(in,"%ld",&st);
	fscanf(in,"%ld",&dr);
	s1=0;
	poz=0;
	while(dr>0)
		{
		s1=s1+c[dr];
		rez=dr&(long)pow(2,poz);
		while(rez==0)
			{
			poz=poz+1;
			rez=dr&(long)pow(2,poz);
			}
		dr=dr-pow(2,poz);
		poz=poz+1;

		}
	st=st-1;
	s2=0;
	poz=0;
	while(st>0)
		{
		s2=s2+c[st];
		rez=st&(long)pow(2,poz);
		while(rez==0)
			{
			poz=poz+1;
			rez=st&(long)pow(2,poz);
			}
		st=st-pow(2,poz);
		poz=poz+1;

		}
	fprintf(out,"%ld\n",s1-s2);
	}
	
	}
fclose(in);
fclose(out);
return 0;

}