Cod sursa(job #73343)

Utilizator vlad3rsterian vladut vlad3r Data 17 iulie 2007 21:03:13
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>


#include <stdlib.h>



int main() 
{ 
FILE *out,*in;
long c[15001];
long n,i,ind,val,poz;
long s1,s2;
long cate,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 ^ (ind-1)) & ind;
		//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 ^ (ind-1)) & ind;
		//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 ^ (dr-1)) & dr;
		//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 ^ (st-1)) & st;
		//st=st-pow(2,poz);
		//poz=poz+1;

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

}