Cod sursa(job #641329)

Utilizator ELHoriaHoria Cretescu ELHoria Data 27 noiembrie 2011 21:36:18
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int arb[100001] , N , M ;

void update(int poz,int val)
{
	int C = 0;
	while(C <= N)
	{
		arb[poz]+=val;
		while ( !(poz & (1<<C)) ) C++;
		poz+=(1<<C);
		C+=1;
	}
}

int query(int poz)
{
	int S = 0 , C = 0 ;
	while(poz > 0)
	{
		S += arb[poz];
		while ( !(poz & (1<<C)) ) C++;
		poz-=(1<<C);
		C+=1;
	}
	return S;
}

int search(int val)
{
	int steps = 1;
	for(;steps < N;steps<<=1);

	for(int i = 0;steps;steps>>=1)
	{
		if(i + steps<=N)
		{
			if(val >= arb[i+steps])
			{
			i += steps , val -= arb[i];
			if(!val) return i;
			}
		}
	}
	return -1;
}

int main()
{
	int tip , x , y ;
	fin>>N>>M;
	for(int i=1;i<=N;++i)
		fin>>x , update(i,x);

	for(;M;M--)
	{
		fin>>tip;

		if(tip == 2)
		{
			fin>>x;
			fout<<search(x)<<'\n';
		}
		else
		{
			fin>>x>>y;
			if(tip == 0) update(x,y);
			else
				fout<<query(y) - query(x-1)<<'\n';
		}
	}
	return 0;
}