Cod sursa(job #279033)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 12 martie 2009 17:26:19
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>

int N, M, v[100005], arb[100005];

int LSB(int x)
{
	return (x ^ (x - 1)) & x;
}

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

	int i, j, op, x, y, s1, s2;

	scanf("%d %d", &N, &M);
	for (i = 1; i <= N; i++)
	{
		scanf("%d", &x);
		j = i;
		while (j <= N)
		{
			arb[j] += x;
			j += LSB(j);
		}
	}

	for (i = 1; i <= M; i++)
	{
		scanf("%d",&op);
		if (op == 0)
		{
			scanf("%d %d", &x, &y);
			j = x;
			while (j <= N)
			{
				arb[j] += y;
				j += LSB(j);
			}
		}

		if (op == 1)
		{
			scanf("%d %d", &x, &y);
			x--;			
			s1 = s2 = 0;
			j = x;
			while (j)
			{
				s1 += arb[j];
				j -= LSB(j);
			}
			j = y;
			while (j)
			{
				s2 += arb[j];
				j -= LSB(j);
			}
			printf("%d\n", s2 - s1);
		}

		if (op == 2)
		{
			scanf("%d", &x);
			int p, u, m, sol = -1;
			p = 1; u = N;
			
			while (p <= u)
			{
				m = (p + u) / 2;

				j = m; s1 = 0;
				while (j)
				{
					s1 += arb[j];
					j -= LSB(j);
				}

				if (s1 == x)
				{
					sol = m; u = m - 1;
				}
				else if (s1 > x) u = m - 1;
				else p = m + 1;
			}
			printf("%d\n", sol);
		}
	}
	return 0;
}