Cod sursa(job #545245)

Utilizator bog29Antohi Bogdan bog29 Data 2 martie 2011 22:57:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#define dmax 100001
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");

int n,m,aib[dmax];
short int x[dmax];

void update(int a,int b)
{	
	int poz;
	
	poz=a;
	aib[a]+=b;
	
	while(poz < n)
	{	
		poz+= (poz & (-poz) );
		aib[poz]+=b;
	}
}	

int suma(int a)
{
	int poz,s=0;
	
	s+=aib[a];
	poz=a;
	
	while(poz > 0)
	{
		poz-=( poz & (-poz) );
		s+=aib[poz];	
	}
	return s;
}	

void build_aib()
{	
	int i;
	
	for(i=1;i<=n;i++)
		update(i,x[i]);
}

int bins(int a)
{	
	int l,r,m,s;
	
	l=1, r=n; 

	while(l <= r)
	{	
		m=(l+r)/2;
		s=suma(m);
		
		if(s == a )
			return m;
			
		else if( s < a)
			l=m+1;
		
		else r=m-1;
	}	
	return -1;
	
}

int main()
{	int i,op,a,b;

	in>>n>>m;

	for(i=1;i<=n;i++)
		in>>x[i];

	build_aib();
	
	for(i=1;i<=m;i++)
	{	in>>op;
		if(op==0)
		{	in>>a>>b;
			update(a,b);
		}
		else if(op==1)
		{	in>>a>>b;
			out<<suma(b)-suma(a-1)<<'\n';
		}	
		else 
		{	in>>a;
			out<<bins(a)<<'\n';
		}
	}
	
	in.close();
	out.close();
	
	return 0;
}