Cod sursa(job #26121)

Utilizator MipiCornea Mihai Mipi Data 5 martie 2007 11:07:55
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<fstream.h>
#include<math.h>
#include<stdio.h>

#define glb 150004

FILE *f=fopen("datorii.in","r");
//FILE *g=fopen("datorii.out","w");
ofstream g("datorii.out");

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

double suma(int x,int y)
{
 long double s=0;
 for(int i=x;i<=y;i++)
  s+=(long 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;
 fscanf(f,"%d%d",&m,&n);
 for(i=1;i<=n;i++)
  fscanf(f,"%d",&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)
{
 long double s=0;
 for(int i=poz;i>0;)
 {
  s+=(long double)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++)
 {
  fscanf(f,"%d%d%d",&op,&v1,&v2);
  if(op==0)
  {
   for(j=v1;j<=n;)
   {
    c[j]-=v2;
    j=j+(int)pow(2,z[j]);
   }
  }
  else
  {
   long double descr=sump(v2)-sump(v1-1);
   //fprintf(g,"%f %c",descr,13);
   g<<descr<<"\n";
  }
 }
}

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