Cod sursa(job #174975)

Utilizator damaDamaschin Mihai dama Data 9 aprilie 2008 13:52:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>

unsigned int aib[100001];
unsigned int n, m, log;


void add(unsigned int, unsigned int);
unsigned int query(unsigned int);
unsigned int search(unsigned int);

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

	unsigned int a, b, i, tip, res;
	scanf("%u%u", &n, &m);

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

	i = 0;
	while((1 << i) <= n)
	{
		
		++i;
	}
	log = i - 1;

	for(i = 1; i <= m; ++i)
	{
		scanf("%u", &tip);
		if(tip == 0)
		{
			scanf("%u %u", &a, &b);
			add(a, b);
		}
		else if(tip == 1)
		{
			scanf("%u %u", &a, &b);
			res = query(b) - query(a - 1);
			printf("%u\n", res);
		}
		else
		{
			scanf("%u", &a);
			res = search(a);
			if(res == 0)
				printf("-1\n");
			else
				printf("%u\n", res);
		}
	}
	return 0;
}

void add(unsigned int pos, unsigned int val)
{
	while(pos <= n)
	{
		aib[pos] += val;
		pos += pos & (pos ^ (pos - 1));
	}
}

unsigned int query(unsigned int pos)
{
	unsigned int res = 0;
	while(pos)
	{
		res += aib[pos];
		pos -= pos & (pos ^ (pos - 1));
	}
	return res;
}

unsigned int search(unsigned int val)
{
	unsigned int pos = 0, res = 0;
	for(int i = (int)log; i >= 0; --i)
	{
		if(pos + (1 << i) <= n && aib[pos + (1 << i)] + res <= val)
		{
			pos += 1 << i;
			res += aib[pos];
		}
	}

	if(res == val)
	{
		return pos;
	}
	return 0;
}