Cod sursa(job #744343)

Utilizator fhandreiAndrei Hareza fhandrei Data 8 mai 2012 14:02:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
//Include
#include <fstream>
using namespace std;

//Constante
const int MAX_SIZE = 100001;

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

//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) // update
		{
			int pos, val;
			in >> pos >> val;
			update(pos, val);
		}
		else if(operation==1) // query
		{
			int lf, rt;
			in >> lf >> rt;
			out << query(rt) - query(lf-1) << '\n';
		}
		else // search
		{
			int val;
			in >> val;
			out << search(val) << '\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;
}

int search(int value)
{
	int left = 1, right = elementNumber;
	
	while(left<=right)
	{
		int mid = (left+right)>>1;
		int sum = query(mid);
		if(sum == value)
			return mid;
		if(value < sum)
			right = mid - 1;
		else
			left = mid + 1;
	}
	return -1;
}