Cod sursa(job #384538)

Utilizator raduzerRadu Zernoveanu raduzer Data 20 ianuarie 2010 13:05:08
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>

#define lsb(i) (int)(i & -i)

const int MAX_N = 100010;

int n, m;
int aib[MAX_N];

inline void update(int poz, int val)
{
	while (poz <= n)
	{
		aib[poz] += val;
		poz += lsb(poz);
	}
}

inline int query(int poz)
{
	int ret = 0;

	while (poz)
	{
		ret += aib[poz];
		poz &= poz - 1;
	}

	return ret;
}

inline int search(int val)
{
	if (val == 0) 
		return -1;
	int pow = 1, i;

	for (; pow <= n; pow <<= 1);

	for (i = 0; pow; pow >>= 1)
		if (i + pow <= n && aib[i + pow] <= val)
		{
			val -= aib[i + pow];
			i += pow;
		}

	if (!val)
		return i;
	return -1;
}

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

	scanf("%d %d", &n, &m);

	for (i = 1; i <= n; ++i)
	{
		int r;
		scanf("%d", &r);

		aib[i] += r;

		if (i + lsb(i) <= n)
			aib[i + lsb(i)] += aib[i];
	}

	for (i = 1; i <= m; ++i)
	{
		int r1, r2, r3;

		scanf("%d %d", &r1, &r2);

		if (r1 == 0)
		{
			scanf("%d", &r3);

			update(r2, r3);
		}

		if (r1 == 1)
		{
			scanf("%d", &r3);

			printf("%d\n", query(r3) - query(r2 - 1));
		}

		if (r1 == 2)
			printf("%d\n", search(r2));
	}
}