Cod sursa(job #1379548)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 6 martie 2015 18:21:53
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb

#include <fstream>

const int MAX_N(100001);

int Bit [MAX_N];
int n;

inline int Lsb (int x)
{
	return x & -x;
}

inline void Update (int index, int val)
{
	while (index <= n)
	{
		Bit[index] += val;
		index += Lsb(index);
	}
}

inline int Query (int index)
{
	int result(0);
	while (index)
	{

		result += Bit[index];
		index -= Lsb(index);

	}
	return result;
}

int main (void)
{
	std::ifstream input("aib.in");
	int m, code, x, y;
	input >> n >> m;
	for (int i(1) ; i <= n ; ++i)
	{
		input >> x;
		Update(i,x);
	}
	std::ofstream output("aib.out");
	while (m)
	{
		input >> code;
		if (code == 0 || code == 1)
			input >> x >> y;
		else
			input >> x;
		if (code == 0)
			Update(x,y);
		else if (code == 1)
			output << Query(y) - Query(x - 1) << '\n';
		else
		{
			int l(1), r(n), m((l + r) / 2), value(Query(m));
			while (l < r && value != x)
			{
				if (value < x)
					l = m + 1;
				else
					r = m - 1;
				m = (l + r) / 2;
				value = Query(m);
			}
			output << (value == x ? m : -1) << '\n';
		}
		--m;
	}
	return 0;
}