Cod sursa(job #767598)

Utilizator lucian666Vasilut Lucian lucian666 Data 13 iulie 2012 23:26:07
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb


#include<fstream>
#define NN 100001

using namespace std;
ofstream out("aib.out");

int n,m,arb[NN];

void read();
int raspuns( int pozitie );
void adauda(int pozitie,int element);
int cauta(int element);

int main()
{
	read();
	return 0;
}

void adauga(int pozitie,int element)
{
	int pozbit=0;
	while(pozitie <= n)
	{
		arb[pozitie] += element;
		while(!(pozitie & (1<<pozbit) ) )
			pozbit++;
		pozitie+= (1<<pozbit);
		pozbit+=1;
	}
}


int raspuns(int pozitie)
{
	int pozbit=0,suma=0;
	while(pozitie > 0 )
	{
		suma+=arb[pozitie];
		while(!(pozitie & (1<<pozbit) ) )
			pozbit++;
		pozitie-= (1<<pozbit);
		pozbit+=1;
	}
	return suma;
}

int cauta(int element)
{
	
	int st,dr;
	st=1,dr=n;
	int s;
	while(st<=dr)
	{
		int middle=(st+dr)/2;
		s=raspuns(middle);
		if(s==element)
			return middle;
		if(s<element)
			st=middle+1;
		else
			dr=middle-1;
	}
	return -1;
}

void read()
{
	ifstream in("aib.in");
	in>>n>>m;
	for(int x,i=1;i<=n;i++)
	{
		in>>x;
		adauga(i,x);
	}
	for(int tip;m;--m)
	{
		in>>tip;
		
		if(tip==0)
		{
			int x,y;
			in>>x>>y;
			adauga(x,y);
		}
		else
			if(tip==1)
			{
				int x,y;
				in>>x>>y;
				out<<raspuns(y)- raspuns (x-1)<<'\n';
			}
			else
				if(tip==2)
				{
					int x;
					in>>x;
					out<<cauta(x)<<'\n';
				}
	}
	
}