Cod sursa(job #1037139)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 19 noiembrie 2013 21:52:02
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <cstdlib>
using namespace std;

ifstream in ("aib.in");
ofstream out("aib.out");

int n, m;
int AIB[100001];

int zeros (int valoare)
{
  return (valoare & (valoare - 1)) ^ valoare;
}

void update (int pozitie, int valoare)
{
  for (int i = pozitie; i <= n; i += zeros(i)) 
    AIB[i] += valoare;
}

int query (int pozitie)
{
  int suma = 0;

  for (int i = pozitie; i > 0; i -= zeros(i))
    suma += AIB[i];
  
  return suma;
}

void solve0(int poz, int val)
{
  update(poz, val);
}

void solve1(int a, int b)
{
  out << query(b) - query(a - 1) << "\n";
}

void solve2(int suma)
{
  int i, step;  
  for (step = 1; step < n; step <<= 1);
     
  for (i = 0; step != 0; step >>= 1)
    if (i + step <= n)
      if (suma >= AIB[i + step])
	{
	  i += step;
	  suma -= AIB[i];
	  
	  if (!suma)
	    {
	      out << i << "\n";
	      return;
	    }
	}
  
  out << -1 << "\n";
}

int main()
{
  int x;
  in >> n >> m;
  for (int i = 1; i <= n; ++i)
    in >> x, update(i, x);

  while (m --> 0)
    {
      int queryType; in >> queryType;

      int a, b;
      switch (queryType)
	{
	case 0:
	  in >> a >> b;
	  solve0(a, b);
	  break;
	case 1:
	  in >> a >> b;
	  solve1(a, b);
	  break;
	case 2:
	  in >> a;
	  solve2(a);
	  break;
	default:
	  exit(1);
	}
    }

  in .close();
  out.close();

  return 0;
}