Cod sursa(job #781282)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 24 august 2012 01:46:17
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb

#include <cstdio>

const unsigned int MAX_SIZE(15001);

int bit [MAX_SIZE];

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

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

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

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

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