Cod sursa(job #1081238)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 13 ianuarie 2014 13:28:27
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<cstring>
#define NMAX 100010

using namespace std;

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

int T, n, val[NMAX], arb[NMAX], S;

inline int ultim(int x)
{
    return x^(x&(x-1));
}

void Update(int val, int pz)
{
    for (; pz<=n; pz+=ultim(pz))
        arb[pz]+=val;
}

void Citeste()
{
  int i;

  f>>n;

  memset (arb, 0, sizeof(arb));

  for (i=1; i<=n; ++i)
  {
      f>>val[i];
      Update(val[i], i);
  }
}

void query(int lim, int pz)
{
    int sum=0;

    for (; pz>lim; pz-=ultim(pz))
        S+=arb[pz];
}

void Solve()
{
  int m, op, x, b1, b2;

  f>>m;

  while (m--)
  {
    f>>op;

    if (op==1)
    {
      f>>x>>b1;

      Update(x, b1);
      val[b1]+=x;
    }
    else
      if (op==2)
      {
        f>>x>>b1;

        x*=-1; val[b1]+=x;
        Update(x, b1);
      }
      else
        if (op==3)
        {
          f>>x>>b1>>b2;

          Update(x, b2); val[b2]+=x;

          x*=-1;

          Update(x, b1); val[b1]+=x;
        }
        else
        {
          f>>b1>>b2;

          S=-val[b1];
          query(b1-b2, b1+b2);

          g<<S<<"\n";
        }
  }
}

int main()
{
  f>>T;

  while (T--)
  {
    Citeste();

    Solve();
  }

  f.close();
  g.close();
  return 0;
}