Cod sursa(job #45701)

Utilizator g3ppyStoian Vlad g3ppy Data 1 aprilie 2007 20:17:10
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <math.h>
#define NRM 15000
FILE *fin,*fout;
int a[NRM];


int main()

{long n,m,i,l,val,ind,poz,x,dr,st,s1,s2;

fin=fopen("datorii.in","rt");
fout=fopen("datorii.out","wt");

fscanf(fin,"%ld %ld",&n,&m);
for (i=1;i<=n;i++)
 {
 fscanf(fin,"%ld",&val);

   ind=i;
   poz=0;
   x=1;
   while (ind<=n)
   {
   a[ind]=a[ind]+val;
   x*=2;

   while ((ind&x)==0)
	 {
	 poz++;
	 x*=2;
	 }
   ind=ind+x;
   poz++;
   }



 }
for (i=1;i<=m;i++)
    {
    fscanf (fin,"%ld",&l);
    if (l==1)
       {
       fscanf(fin,"%ld %ld",&st,&dr);
       s1=0;
       poz=0;
       x=1;
       while (dr>0)
	  {
	  s1+=a[dr];
	  x=2*x;
	  while ((dr&x)==0)
	     {
	     poz++;
	     x=2*x;
	     }
	  dr-=x;
	  poz++;
	  }
       st--;
       s2=0;
       poz=0;
       x=1;
       while (st>0)
	  {
	  s2+=a[st];
	  x=2*x;
	  while((st&x)==0)
	       {
	       poz++;
	       x=2*x;
	       }
	  st-=x;
	  poz++;

	  }
       fprintf(fout,"%ld\n",s1-s2);
       }

    else
      {
       fscanf(fin,"%ld %ld",&ind,&val);

   val*=-1;
   poz=0;
   x=1;
   while (ind<=n)
   {
   a[ind]=a[ind]+val;
   x*=2;

   while ((ind&x)==0)
	 {
	 poz++;
	 x*=2;
	 }
   ind=ind+x;
   poz++;
   }


      }

    }


fprintf(fout,"\n");

return 0;
}