Cod sursa(job #744265)

Utilizator fhandreiAndrei Hareza fhandrei Data 8 mai 2012 09:49:54
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
//Include
#include <fstream>
using namespace std;

//Constante
const int MAX_SIZE = 10001;

//Functii
void update(int position, int value);
int query(int position);

//Variabile
ifstream in("aib.in");
ofstream out("aib.out");

int elementNumber, operationNumber;
int operation;

int tree[MAX_SIZE];

//Main
int main()
{
	in >> elementNumber >> operationNumber;
	
	int val;
	for(int i=1 ; i<=elementNumber ; ++i)
	{
		in >> val;
		update(i, val);
	}
	
	while(operationNumber--)
	{
		in >> operation;
		if(operation == 1) // update
		{
			int pos, val;
			in >> pos >> val;
			update(pos, val);
		}
		else // query
		{
			int lf, rt;
			in >> lf >> rt;
			out << query(rt) - query(lf-1) << '\n';
		}
	}
	
	in.close();
	out.close();
	return 0;
}

void update(int position, int value)
{
	int power = 0;
	while(position <= elementNumber)
	{
		tree[position] += value;
		while(!(position & (1<<power)))
			++power;
		position += (1<<power);
		++power;
	}
}

int query(int position)
{	
	int sum = 0;
	int power = 0;
	while(position)
	{
		sum += tree[position];
		while(!(position & (1<<power)))
			++power;
		position -= (1<<power);
	}
	return sum;
}