Cod sursa(job #1379795)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 6 martie 2015 19:31:42
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb

#include <fstream>

const int MAX_N(100001);
const int LOG2(16);

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 index(0);
			for (int i(LOG2) ; i >= 0 && x ; --i)
				if (index + (1 << i) <= n && Bit[index + (1 << i)] <= x)
				{
					if (Bit[index + (1 << i)] == x && Query(index + (1 << i)) == Query(index + (1 << i) - 1))
						continue;
					index += (1 << i);
					x -= Bit[index];
				}
			output << (x == 0 ? index : -1) << '\n';
		}
		--m;
	}
	return 0;
}