Cod sursa(job #792244)

Utilizator adascaluAlexandru Dascalu adascalu Data 26 septembrie 2012 19:52:02
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
using namespace std;
#include<fstream>
#include<vector>
#define nmax 100001
vector<int> aib(nmax);
int n;
ofstream g("aib.out");
inline int zeros(int x)
{
	int nr=0;
	x=x&(-x);
	while(x>1)
		++nr,x>>=1;
	return nr;
}
void update(int poz,int x)
{
	while(poz<=n)
	{
		aib[poz]+=x;
		poz+=(1<<zeros(poz));
	}
}
int query(int a,int b)
{
	long long int s1=0,s2=0;
	--a;
	while(a>0)
	{
		s1+=aib[a];
		a-=(1<<zeros(a));
	}
	while(b>0)
	{
		s2+=aib[b];
		b-=(1<<zeros(b));
	}
	return s2-s1;
}
void search(long long int k)
{
	long long int s1,s2;
	int li=1, ls=n,mij;
	if(query(1,1)==k)
	{
		g<<1<<"\n";
		return ;
	}
	while(li<=ls)
	{
		mij=(li+ls)>>1;
		s1=query(1,mij);
		s2=query(1,ls);
		if(s1==k)
		{
			g<<mij<<"\n";
			return ;
		}
		else
			if(s2==k)
			{	
				g<<ls<<"\n";
				return ;
			}
			else
				if(s1>k)
					li=mij+1;
				else
					ls=mij-1;
	}
	g<<-1<<"\n";
}
int main()
{
	
	int i,m,op,a,b,k,x;
	ifstream f("aib.in");
	f>>n>>m;
	
	for(i=1;i<=n;i++)
	{	
		f>>x;
		update(i,x);
	}

	for(i=1;i<=m;i++)
	{
		f>>op;
		if(op&1)
		{
			f>>a>>b;
			g<<query(a,b)<<"\n";
		}
		else
			if(op)
			{
				f>>k;
				search(k);
			}
			else
			{	f>>a>>b;
				update(a,b);
			}
	}
	f.close();
	g.close();
	return 0;
}