Cod sursa(job #455563)

Utilizator siminescuPaval Cristi Onisim siminescu Data 13 mai 2010 22:18:32
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
#define nmax 100002
int n,m,st,dr,poz,ad;
long long s[nmax],bla;
long long suma(int ind)
{
	long long sum=0;int k=0;
	while(ind)
	{
		sum+=s[ind];
		while((ind&(1<<k))==0) k++;
		ind-=(1<<k);k++;
	}
	return sum;
}
void initializare()
{
	f>>n>>m;
	int i,k,x;for(i=1;i<=n;i++)
	{
		f>>x;
		k=0;
		while((i&(1<<k))==0)
			k++;
		s[i]=suma(i-1)-suma(i-(1<<k))+x;
	}
}
void operatia_0()
{
	int k=0;
	while(poz<=n)
	{
		s[poz]+=ad;
		while((poz&(1<<k))==0) k++;
		poz+=(1<<k);k++;
	}
}
long long 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();
	for(;m;--m)
	{
		f>>x;
		if(x==0)
		{
			f>>poz>>ad;
			operatia_0();
		}
		if(x==1)
		{
			f>>st>>dr;
			g<<operatia_1()<<'\n';
		}
		if(x==2)
		{
			f>>bla;
			g<<operatia_2()<<'\n';
		}
	}
}