Cod sursa(job #641326)

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

using namespace std;

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

int arb[100001] , N , M , S , C;

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

int query(int poz)
{
    C = 0, S = 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;
}