Cod sursa(job #792266)

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

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