Cod sursa(job #871862)

Utilizator fhandreiAndrei Hareza fhandrei Data 5 februarie 2013 13:53:18
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
// Include
#include <fstream>
using namespace std;

// Constante
const int sz = (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 num, questions;
int tree[sz];

// Main
int main()
{
	in >> num >> questions;
	int readVal;
	for(int i=1 ; i<=num ; ++i)
		in >> readVal, update(i, readVal);
	
	int type;
	while(questions--)
	{
		in >> type;
		if(type)
		{
			if(type == 1)
			{
				int left, right;
				in >> left >> right;
				out << query(right) - query(left-1) << '\n';
			}
			else
			{
				in >> readVal;
				out << search(readVal) << '\n';
			}
		}
		else
		{
			int position;
			in >> position >> readVal;
			update(position, readVal);
		}
		
		
	}
	
	in.close();
	out.close();
	return 0;
}

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

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

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