Cod sursa(job #112888)

Utilizator spaulc90Sarbu Paul Cristian spaulc90 Data 8 decembrie 2007 10:49:37
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream.h>

int c[20], v[20], n, m, i, j;

 void modif(int ind, int val, char ok)
{
 int poz, put;

 poz = 0;
 put = 1;
 while (ind <= n)
 {
  if (ok == '+')
   c[ind] += val;
   else
    c[ind] -= val;

  while ((ind & put) == 0)
  {
   poz++;
   put *= 2;
  }
  ind += put;
 }
}

int suma(int st, int dr)
{
 int s1, s2, poz, put;
 // prima suma:
 s1 = 0;
 poz = 0;
 put = 1;
 while (dr > 0)
 {
  s1 += c[dr];
  while ((dr & put) == 0)
  {
   poz++;
   put *= 2;
  }
  dr -= put;
 }
 // a doua suma:
 s2 = 0;
 poz = 0;
 put = 1; st--;
 while (st > 0)
 {
  s2 += c[st];
  while ((st & put) == 0)
  {
   poz++;
   put *= 2;
  }
  st -= put;
 }
 // calculare suma finala:
 return s1-s2;
}

/*void constr_aib()
{
 int poz, put;

 for (i=1; i<=n; i++)
 {
  j = i; poz = 0; put = 1;
  while (j & put == 0)
  {
   poz++;
   put *= 2;
  }
 }
} */



int main()
{
 ifstream fin("datorii.in");
 ofstream fout("datorii.out");

 fin >> n >> m;
 for (i=1; i<=n; i++)
 {
  fin >> v[i];
  modif(i, v[i], '+');
 }

 int x, a, b;
 for (j=1; j<=m; j++)
 {
  fin >> x;
  if (x == 1)
  {
   fin >> a >> b;
   fout << suma(a, b) << '\n';
  }
  else
  {
   fin >> a >> b;
   modif(a, b, '-');
  }
 }

 fin.close();
 fout.close();

 return 0;
}