Cod sursa(job #748892)

Utilizator fhandreiAndrei Hareza fhandrei Data 15 mai 2012 08:37:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
//Include
#include <fstream>
using namespace std;

//Constante
const int MAX_SIZE = (int)1e5+1;

//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 elements, questions;
int tree[MAX_SIZE];

//Main
int main()
{
	in >> elements >> questions;
	
	int val, pos;
	for(int i=1 ; i<=elements ; ++i)
	{
		in >> val;
		update(i, val);
	}
	
	int type;
	int left, right;
	while(questions--)
	{
		in >> type;
		if(type)
		{
			if(type == 1)
			{
				in >> left >> right;
				out << query(right) - query(left-1) << '\n';
			}
			else
			{
				in >> right;
				out << search(right) << '\n';
			}
		}
		else
		{
			in >> pos >> val;
			update(pos, val);
		}
	}
}

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

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

int search(int value)
{
	int left = 1, right = elements;
	
	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;
}