Cod sursa(job #419145)

Utilizator slayer4uVictor Popescu slayer4u Data 17 martie 2010 00:06:32
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>

#define zeros(x) (x ^ (x - 1)) & x
#define NMAX 100001

long aib[NMAX], a, b, code, n, m;

void add(long a, long b)
{
	for (long i = a; i <= n; i += zeros(i))
		aib[i] += b;
}

long compute(long a)
{
	long tmp = 0;

	for (long i = a; i > 0; i -= zeros(i))
		tmp += aib[i];

	return tmp;
}

long bs(long val)
{
    int i, step;
    for (step = 1; step <= n; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step <= n && compute(i + step) <= val)
           i += step;
    return i;
}

long bin_search(long left, long right, long x)
{
	long mid = (left + right) / 2, tmp = compute(mid);
	if (tmp == x)
		return mid;

	if (left == right)
		return -1;

	if (tmp > x)
	{
		return bin_search(left, mid - 1, x);
	}

	return bin_search(mid + 1, right, x);
}

int main()
{
	freopen ("aib.in", "rt", stdin);
	freopen ("aib.out", "wt", stdout);

	scanf("%ld %ld", &n, &m);
	for (long i = 1; i <= n; ++i)
	{
		scanf("%ld", &a);
		add(i, a);
	}

	for (long i = 0; i < m; ++i)
	{
		scanf("%ld %ld", &code, &a);
		if (code != 2)
			scanf("%ld", &b);

		if (code == 0)
		{
			add(a, b);
		}
		else
		if (code == 1)
		{
			printf("%ld\n", compute(b) - compute(a - 1));
		}
		else
		if (code == 2)
		{
			printf("%ld\n", bs(a));
		}
	}

	return 0;
}