Cod sursa(job #1037111)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 19 noiembrie 2013 21:28:39
Problema Arbori indexati binar Scor 0
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 stg = 1; int dr = n;
  while (stg <= dr)
    {
      int mid = (stg + dr) >> 1;
      
      int queryMid = query(mid);
      if (queryMid == suma)
	{
	  out << mid << "\n";
	  return;
	}

      if (queryMid > suma)      
	stg = mid + 1;
      else
	dr = mid - 1;
    }

  out << stg;
}

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;
}