Cod sursa(job #216730)

Utilizator raduzerRadu Zernoveanu raduzer Data 25 octombrie 2008 15:14:14
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>

const int MAX_N = 100010;

int n, m;
int aib[MAX_N];

void update(int x, int y)
{
	while (x <= n)
	{
		aib[x] += y;
		x += x ^ (x - 1) & x;
	}
}

int query(int x)
{
	int val = 0;

	while (x)
	{
		val += aib[x];
		x &= x - 1;
	}

	return val;
}

int bin(int x)
{
	int i, pow;
	
	for (pow = 1; pow < n; pow <<= 1);

	for (i = 0; pow; pow >>= 1)
		if (i + pow <= n && query(i + pow) <= x) i += pow;

	if (query(i) != x) return -1;

	return i;
}

int main()
{
	int i, x, y, q;
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);

	scanf("%d %d", &n, &m);
	for (i = 1; i <= n; ++i)
	{
		int aux;
		scanf("%d", &aux);
		aib[i] += aux;
		aib[i + (i ^ (i - 1) & i)] += aib[i];
	}

	int sol;
	for (; m; --m)
	{
		scanf("%d", &q);
		if (q == 0)
		{
			scanf("%d %d", &x, &y);
			update(x, y);
		}
		if (q == 1)
		{
			scanf("%d %d", &x, &y);
			sol = query(y) - query(x - 1);
		}
		if (q == 2)
		{
			scanf("%d", &x);
			sol = bin(x);
		}
		if (!sol) --sol;
		if (q) printf("%d\n", sol);
	}
}