Cod sursa(job #791973)

Utilizator adascaluAlexandru Dascalu adascalu Data 25 septembrie 2012 22:44:17
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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));
	}
}
void 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));
	}
	g<<s2-s1<<"\n";
}
void search(int k)
{
	int i=1,j;
	bool ok=true;
	long long int s;
	while(i<=n &&ok)
	{
		s=0;j=i;
		while(j>0)
		{
			s+=aib[j];
			j-=(1<<zeros(j));
		}
		if(s==k)
			g<<i<<"\n",ok=false;
		++i;
	}
	if(ok)
		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;
			query(a,b);
		}
		else
			if(op)
			{
				f>>k;
				search(k);
			}
			else
			{	f>>a>>b;
				update(a,b);
			}
	}
	f.close();
	g.close();
	return 0;
}