Cod sursa(job #1120026)

Utilizator robert_stefanRobert Stefan robert_stefan Data 24 februarie 2014 21:13:56
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#define IN "aib.in"
#define OUT "aib.out"
#define NMAX 100005

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int n, m, v[NMAX], aib[4*NMAX], suma;

inline void creare(int nod, int st, int dr)
{
	if(st==dr)
		aib[nod]=v[st];
	else
	{
		int mijl=(st+dr)/2;
		creare(2*nod, st, mijl);
		creare(2*nod+1, mijl+1, dr);
		aib[nod]=aib[2*nod]+aib[2*nod+1];
	}
}

inline void actualizeaza(int nod, int st, int dr, int a, int b)
{
	if(st==dr)
		aib[nod]+=b;
	else
	{
		int mijl=(st+dr)/2;
		if(a<=mijl)
			actualizeaza(2*nod, st, mijl, a, b);
		else
			actualizeaza(2*nod+1, mijl+1, dr, a, b);
		aib[nod]=aib[2*nod]+aib[2*nod+1];
	}
}

inline void verifica(int nod, int st, int dr, int a, int b)
{
	if(a<=st && b>=dr)
		suma+=aib[nod];
	else
	{
		int mijl=(st+dr)/2;
		if(a<=mijl)
			verifica(2*nod, st, mijl, a, b);
		if(mijl<b)
			verifica(2*nod+1, mijl+1, dr, a, b);
	}
}

inline void cautare(int sum)
{
	int st=1, dr=n, mijl;
	bool gasit=0;
	while(st<=dr)
	{
		mijl=(st+dr)/2;
		//out<<st<<' '<<mijl<<' '<<dr<<' ';
		suma=0;
		verifica(1, 1, n, st, mijl);//out<<suma<<' '<<sum<<'\n';
		if(suma>sum)
			dr=mijl-1;
		else if(suma<=sum)
			st=mijl+1;
	}
	suma=0;
	verifica(1, 1, n, st, mijl);
	if(suma==sum)
		out<<mijl<<'\n';
	else out<<mijl-1<<'\n';
}

int main()
{
	int i, cod, a, b;
	in>>n>>m;
	for(i=1; i<=n; ++i)
		in>>v[i];
	creare(1, 1, n);
	suma=0;
	verifica(1, 1, n, 1, 4);
	while(m--)
	{
		in>>cod;
		if(cod==0)
		{
			in>>a>>b;
			actualizeaza(1, 1, n, a, b);
		}
		else if(cod==1)
		{
			in>>a>>b;
			if(a!=b)
			{
				suma=0;
				verifica(1, 1, n, a, b);
				out<<suma<<'\n';
			}
			else
				out<<v[a]<<'\n';
		}
		else
		{
			in>>a;
			cautare(a);
		}
	}
	in.close();
	out.close();
	return 0;
}