Cod sursa(job #2036537)

Utilizator robuvedVictor Robu robuved Data 10 octombrie 2017 19:46:49
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream in("aib.in");
ofstream out("aib.out");
#define MAXN 100000

void Update(vector<int> &AIB, int n, int x, int val)
{
	for (; x <= n; x += x & (-x))
	{
		AIB[x] += val;
	}
}
int Query(vector<int> &AIB, int n, int x)
{
	int sum = 0;
	for (; x; x -= x & (-x))
	{
		sum += AIB[x];
	}
	return sum;
}
int SearchSum(vector<int>& AIB, int n, int sum)
{
	int mask = 1;
	while ((mask << 1) <= n) mask <<= 1;
	int poz = 0;
	while (mask && poz <= n)
	{
		int tpoz = poz | mask;
		if (AIB[tpoz] == sum)
		{
			return tpoz;
		}
		else if (AIB[tpoz] < sum)
		{
			sum -= AIB[tpoz];
			poz = tpoz;
		}
		mask >>= 1;
	}
	if (sum == 0)
		return poz;
	return -1;
}
int main()
{
	int N, M;
	in >> N >> M;
	vector<int> v(N);
	vector<int> AIB(N + 1, 0);

	for (int i = 0; i < N; i++)
	{
		in >> v[i];
		Update(AIB, N, i + 1, v[i]);
	}
	while (M--)
	{
		int opt, a, b;
		in >> opt;
		switch (opt)
		{
		case 0: 
			in >> a >> b;
			Update(AIB, N, a, b);
			break;
		case 1:
			in >> a >> b;
			out << Query(AIB, N, b) - Query(AIB, N, a - 1) << '\n';
			break;
		case 2:
			in >> a;
			out << SearchSum(AIB, N, a) << '\n';
			break;
		}
	}
}