Cod sursa(job #1408175)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 29 martie 2015 21:25:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>

const int MAX_N(100001);

int n;
int Bit [MAX_N];

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

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

inline int Query (int index)
{
	int result(0);
	while (index)
	{
		result += Bit[index];
		index -= Lsb(index);
	}
	return result;
}

inline int Search (int value)
{
	int index(0);
	for (int i(16); value && i >= 0; --i)
		if (index + (1 << i) <= n && Bit[index + (1 << i)] <= value)
		{
			index += (1 << i);
			value -= Bit[index];
		}
	return (index && !value ? index : -1);
}

int main (void)
{
	std::ifstream input("aib.in");
	std::ofstream output("aib.out");
	int m;
	input >> n >> m;
	for (int i(1), value; i <= n; ++i)
	{
		input >> value;
		BitUpdate(i,value);
	}
	int q, x, y;
	while (m--)
	{
		input >> q;
		if (q == 0)
		{
			input >> x >> y;
			BitUpdate(x,y);
		}
		else if (q == 1)
		{
			input >> x >> y;
			output << Query(y) - Query(x - 1) << '\n';
		}
		else
		{
			input >> x;
			output << Search(x) << '\n';
		}
	}
	input.close();
	output.close();
	return 0;
}