Cod sursa(job #24382)

Utilizator MipiCornea Mihai Mipi Data 2 martie 2007 10:27:04
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<fstream.h>
#include<math.h>

#define glb 15001

ifstream f("datorii.in");
ofstream g("datorii.out");

int m,n,v[glb],z[glb];
double c[glb];

double suma(int x,int y)
{
 double s=0;
 for(int i=x;i<=y;i++)
  s+=(double)v[i];
 return s;
}

int nr_0(int nr)
{
 int zerouri=0;
 while(nr%2==0)
 {
  nr/=2;
  zerouri++;
 }
 return zerouri;
}

void citire()
{
 int i;
 f>>n>>m;
 for(i=1;i<=n;i++)
  f>>v[i];
 for(i=1;i<=n;i++)
  z[i]=nr_0(i);
}

void init()
{
 for(int i=1;i<=n;i++)
  c[i]=(double)suma(i-(int)pow(2,z[i])+1,i);
}

double sump(int poz)
{
 double s=0;
 for(int i=poz;i>=0;)
 {
  s+=c[i];
  i=i-(int)pow(2,z[i]);
 }
 return s;
}

void procesare()
{
 int i,j;
 int op,v1,v2;
 for(i=1;i<=m;i++)
 {
  f>>op>>v1>>v2;
  if(op==0)
  {
   for(j=v1;j<=n;)
   {
    c[j]-=v2;
    j=j+(int)pow(2,z[j]);
   }
  }
  else
  {
   g<<sump(v2)-sump(v1-1)<<"\n";
  }
 }
}

int main(void)
{
 citire();
 init();
 procesare();
 g.close();
 f.close();
 return 0;
}