Cod sursa(job #456674)

Utilizator siminescuPaval Cristi Onisim siminescu Data 16 mai 2010 13:54:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
using namespace std;
ifstream f("aib.in");
#define nmax 100002
int n,m,st,dr,poz,ad;
int s[nmax],bla;
long long suma(int ind)
{
	long long sum=0;
	while(ind)
	{
		sum+=s[ind];
		ind-=(ind&-ind);
	}
	return sum;
}
void operatia_0()
{
	while(poz<=n)
	{
		s[poz]+=ad;
		poz+=(poz&-poz);
	}
}
void initializare()
{
	int i;f>>n>>m;
	for(i=1;i<=n;i++)
	{
		f>>ad;poz=i;
		operatia_0();
	}
}
int operatia_1()
{
	st--;
	return suma(dr)-suma(st);
}
int operatia_2()
{
	st=1;dr=n;int mij;
	while(st<dr)
	{
		mij=(st+dr)/2;
		if(suma(mij)>=bla)
			dr=mij;
		else
			st=mij+1;
	}
	if(suma(st)==bla)
		return st;
	return -1;
}
int main()
{
	int x;
	initializare();freopen("aib.out","w",stdout);
	for(;m;--m)
	{
		f>>x;
		if(x==0)
		{
			f>>poz>>ad;
			operatia_0();
		}
		if(x==1)
		{
			f>>st>>dr;
			bla=operatia_1();printf("%d\n",bla);
		}
		if(x==2)
		{
			f>>bla;
			st=operatia_2();printf("%d\n",st);
		}
	}
}