Cod sursa(job #781293)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 24 august 2012 02:14:13
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb

#include <cstdio>

const unsigned int MAX_SIZE(15001);

unsigned int bit [MAX_SIZE];

inline unsigned int lsb (const unsigned int number)
{
	return number & -number;
}

inline void bit_init (unsigned int index, unsigned int value, const unsigned int size)
{
	do
	{
		bit[index] += value;
		index += lsb(index);
	}
	while (index <= size);
}

inline void bit_update (unsigned int index, unsigned int value, const unsigned int size)
{
	do
	{
		bit[index] -= value;
		index += lsb(index);
	}
	while (index <= size);
}

inline unsigned int bit_sum (unsigned int index, const unsigned int size)
{
	unsigned int sum(bit[index]);
	index -= lsb(index);
	while (index)
	{
		sum += bit[index];
		index -= lsb(index);
	}
	return sum;
}

int main (void)
{
	std::freopen("datorii.in","r",stdin);
	std::freopen("datorii.out","w",stdout);
	unsigned int n, m;
	std::scanf("%u%u",&n,&m);
	unsigned int a, *a_ptr(&a);
	{
		unsigned int counter(1);
		do
		{
			std::scanf("%u",a_ptr);
			bit_init(counter,a,n);
			++counter;
		}
		while (counter <= n);
	}
	unsigned int operation, *operation_ptr(&operation), b, *b_ptr(&b);
	do
	{
		std::scanf("%u%u%u",operation_ptr,a_ptr,b_ptr);
		if (operation)
			std::printf("%u\n",bit_sum(b,n) - bit_sum(a - 1,n));
		else
			bit_update(a,b,n);
		--m;
	}
	while (m);
	std::fclose(stdin);
	std::fclose(stdout);
	return 0;
}