Cod sursa(job #612917)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 13 septembrie 2011 09:35:03
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
using namespace std;
int n,m,v[100010];

void Aduna(int poz,int x)
{
	int k,aux;
	while(poz<=n)
	{
		v[poz]+=x;
		k=0; aux=poz;
		while(aux%2==0)
		{
			aux=(aux>>1);
			k++;
		}
		poz=poz+(1<<k);
	}
}

int Suma(int poz)
{
	int k,aux,sum=0;
	while(poz)
	{
		sum+=v[poz];
		k=0; aux=poz;
		while(aux%2==0)
		{
			aux=(aux>>1);
			k++;
		}
		poz=poz-(1<<k);
	}
	return sum;
}

int CautareBinara(int S)
{
	int st,dr,m,sum;
	st=1;
	dr=n;
	while(st<=dr)
	{
		m=(st+dr)/2;
		sum=Suma(m);
		if(sum==S)
			return m;
		if(sum<S)
			st=m+1;
		else
			dr=m-1;
	}
	return -1;
}

int main()
{
	int i,x,op,a,b;
	ifstream fin("aib.in");
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		fin>>x;
		Aduna(i,x);
	}
	ofstream fout("aib.out");
	for(i=1;i<=m;i++)
	{
		fin>>op;
		if(op==0)
		{
			fin>>a>>b;
			Aduna(a,b);
			continue;
		}
		if(op==1)
		{
			fin>>a>>b;
			x=Suma(b)-Suma(a-1);
			fout<<x<<"\n";
			continue;
		}
		if(op==2)
		{
			fin>>a;
			x=CautareBinara(a);
			fout<<x<<"\n";
		}
	}
	fin.close();
	fout.close();
	return 0;
}