Cod sursa(job #200102)

Utilizator Ramona2007Furtuna Ramona Cristina Ramona2007 Data 22 iulie 2008 12:14:51
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<iostream.h>
#include<stdio.h>
#include<math.h>

  long long int v[15001], c[15001], rez[15001];
   long long int i, j, bin, aux, k, n, m, s, suma1, suma2, f, l, modif, poz, val, t;


 long long int nrzero(long long int i)
 {  bin=0;
   while(i!=0)
    {
    if(i%2==0)   
      bin++;
    else
     return bin;

     i=i/2;
    }
  
  return bin;
 }

 void make(long long int i)
 { 
    bin=nrzero(i);
    k=pow(2, bin); 
 for(j=i-k+1;j<=i;j++)
    c[i]=c[i]+v[j]; 
  
 }


  int main()
{
 

freopen("datorii.in", "r", stdin);
freopen("datorii.out", "w", stdout);

cin>>n>>m;



 for(i=1;i<=m;i++)
  {
  cin>>v[i];
     make(i);
  }

for(l=1;l<=n;l++)
{  cin>>modif>>poz>>val;
   suma1=suma2=0;
  if(modif==0)
   { // se modifica valoarea achitata in ziua poz, dar si in zilele care contin pe poz,din vect c
     t=poz;
    
     c[t]=c[t]-val;
       
      poz=poz+pow(2, nrzero(poz));
     while(poz<=m)
     { 
       
       c[poz]=c[poz]-val;
       poz=poz+pow(2, nrzero(poz));
     }
   
   }

  else
   {  
    // calculam suma achitata in intervalul <poz, val>

   // <1, poz-1>
    t=poz-1;
   
    while(t>0)
    {  
    
 
    suma1=suma1+c[t];
   
       t=t-pow(2, nrzero(t));
    }
  
  //<1, val>
   t=val;
    
    while(t>0)
    {  suma2=suma2+c[t];
     
       t=t-pow(2, nrzero(t));
    }
  

 rez[++f]=suma2-suma1;
   }
}

for(i=1;i<=f;i++)
 cout<<rez[i]<<endl;


return 0;
}