Cod sursa(job #642424)

Utilizator ELHoriaHoria Cretescu ELHoria Data 1 decembrie 2011 12:32:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

using namespace std;

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

int arb[100005] , N , M , setv;

void update(int idx,int val)
{
	for(;idx<=N;idx+=(idx & -idx))
		arb[idx]+=val;
}

int query(int idx)
{
	int s;
	for(s = 0;idx>0;idx-=(idx & -idx))
		s+=arb[idx];
	return s;
}

void compute()
{
	for(setv = 1;setv<N;setv<<=1);
}

int search(int val)
{
	for(int i = 0 , steps = setv;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;
	compute();
	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;
}