Cod sursa(job #993871)

Utilizator diac_paulPaul Diac diac_paul Data 4 septembrie 2013 16:33:23
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#define NMax 100005

int n, m, s[NMax];

void update(int p, int add)
{
	for (int pi = p; pi <= n; pi = pi + ((pi ^ (pi - 1)) & pi))
		s[pi] += add;
}

int query(int p)
{
	int r = 0;
	for (int pi = p; pi > 0; pi = pi - ((pi ^ (pi - 1)) & pi))
		r += s[pi];
	return r;
}

int search(int val)
{
	int p = 0, pi;
	for (pi = 1; pi <= n; pi = pi << 1);
	pi = pi >> 1;

	for (; p + pi <= n && pi > 0; pi = pi >> 1)
	{
		if (s[p + pi] <= val)
		{
			val -= s[p + pi];
			p += pi;
		}
	}	

	if (val == 0)
		return p;
	return -1;
}

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

	int t, a, b;

	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a);
		update(i, a);
	}
	
	while (m--)
	{
		scanf("%d %d", &t, &a);
		if (t != 2)
			scanf("%d", &b);

		if (t == 0)
			update(a, b);
		else if (t == 1)
			printf("%d\n", query(b) - query(a-1));
		else
			printf("%d\n", search(a));
	}
	
	return 0;
}