Cod sursa(job #114100)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 12 decembrie 2007 17:37:06
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb

#include <math.h>
#include <fstream.h>
long p;
long sum(long *a[],long t,long v,long n,long i)
{long s=0;
 if(t==pow(2,p-n)*i&&v==pow(2,p-n)*(i+1)-1)
 {return a[n][i];}
 if(t<pow(2,p-n-1)*(2*i+1))
 {s+=sum(a,t,pow(2,p-n-1)*(2*i+1)-1,n+1,2*i);
 }
 if(v>=pow(2,p-n-1)*(2*i+1))
 {s+=sum(a,pow(2,p-n-1)*(2*i+1),v,n+1,2*i+1);
 }
 return s;
}
int main()
{
 long *a[15],*b;
 long n,m,i,j,f,t,v;
 ifstream fin("datorii.in");
 ofstream fout("datorii.out");
 fin>>n>>m;
 p=ceil((float)log(n)/log(2));

 b=new long[(int)pow(2,p)];
 memset(b,0,pow(2,p)*sizeof(long));
 a[p]=b;
 for (i=0;i<n;i++)
 {fin>>b[i];
 }
 for (i=p-1;i>=0;i--)
 {b=new long[(int)pow(2,i)];
  memset(b,0,pow(2,i)*sizeof(long));
  a[i]=b;
  for (j=0;j<pow(2,i);j++)
  {b[j]=a[i+1][2*j]+a[i+1][2*j+1];
  }
 }

 for (i=1;i<=m;i++)
 {fin>>f>>t>>v;
  if(!f)
  {t--;
   for (j=p;j>=0;j--,t/=2)
   {a[j][t]-=v;
   }
  }
  else
  {fout <<sum(a,t-1,v-1,0,0)<<'\n';
  }
 }
fout.close();
return 0;
}