Cod sursa(job #114176)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 12 decembrie 2007 22:17:11
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <math.h>
#include <string.h>
#include <fstream.h>
int main ()
{ifstream f("datorii.in");
 ofstream ff("datorii.out");
 long a[15001],n,m,i,j,k,l,x,y,z,s1,s2,q;
 memset(a,0,sizeof(a));
 f>>n>>m;
 for (i=1;i<=n;i++)
 {f>>a[i];}
 for (i=1;i<=n;i++)
 {l=i;k=0;
  while(l%2==0){k++;l/=2;}
  for (l=i-1,j=1;j<=k;j++)
  {a[i]+=a[l];
   x=l;y=0;
   while(x%2==0){y++;x/=2;}
   l-=pow(2,y);
  }
 }
 for (i=1;i<=m;i++)
 {f>>j>>k>>l;
  if(j==1)
  {y=k-1;z=1;
   while(y%2==0&&y>0){z*=2;y/=2;}
   q=z+1;
   s1=0;
   x=k-1;
   while(x>0&&q>0)
   {q--;
    s1+=a[x];
    y=x;z=1;
    while(y%2==0&&y>0){z*=2;y/=2;}
    x-=z;
   }
   y=l;z=1;
   while(y%2==0&&y>0){z*=2;y/=2;}
   q=z+1;
   s2=0;
   x=l;
   while(x>0&&q>0)
   {q--;
    s2+=a[x];
    y=x;z=1;
    while(y%2==0&&y>0){z*=2;y/=2;}
    x-=z;
   }
   ff<<s2-s1<<'\n';
  }
  else
  {y=k;          a[y]-=l;
   while(y<=n)
   {x=y;z=1;
    while(x%2==0){z*=2;x/=2;}
    y+=z;
     if(y<=n)
    a[y]-=l;
   }
  }
 }
 return 0;
}