Cod sursa(job #426228)

Utilizator raduzerRadu Zernoveanu raduzer Data 26 martie 2010 17:10:12
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>

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

const int MAX_N = 100010;

int n, m;
int aib[MAX_N];

void add(int poz, int val)
{
	for (; poz <= n; poz += lsb(poz))
		aib[poz] += val;
}

int query(int poz)
{
	return (!poz) ? 0 : aib[poz] + query(poz - lsb(poz));
}

int find(int val)
{
	int pow = 1, i;
	if (!val)
		return -1;

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

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

	return (val) ? -1 : i;
}

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

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

	for (i = 1; i <= n; add(i, x), ++i)
		scanf("%d", &x);

	for (; m; --m)
	{
		scanf("%d %d", &q, &x);
		if (q < 2)
			scanf("%d", &y);
		
		if (!q)
		{
			add(x, y);
			continue;
		}

		printf("%d\n", (q - 1) ? find(x) : (query(y) - query(x - 1)));
	}
}