Cod sursa(job #2445058)

Utilizator urweakurweak urweak Data 2 august 2019 12:46:42
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define dim 100001
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int N, M;
int MaxArb[1<<dim+1];
int start, finish, Val, Pos, maxim;

inline int Maxim(int a, int b){
	if( a > b ) return a;
	return b;
}

void Update(int, int, int);
void Query(int, int, int);

int main()
{
	int X, A, B;

	in >> N >> M;

	for(int i = 1; i<=N; i++)
	{
		in >> X;
		Pos = i, Val = X;
		Update(1, 1, N); // First call creates the tree; the rest updates the tree
	}

	for(int i = 1; i<=M; i++)
	{
		in >> X >> A >> B;
		if(X == 0) // ----> Gaseste Maximul din intervalul [A, B];
		{
			maxim = -1;
			start = A, finish = B;
			Query(1, 1, N);

			out << maxim <<"\n";
		}
		else // -----> Inlocuieste pe A cu B;
		{
			Pos = A, Val = B;
			Update(1, 1, N);
		}
	}
}

void Update(int nod, int left, int right)
{
	if( left == right )
	{
		MaxArb[nod] = Val;
		return;
	}

	int div = (left + right) / 2;
	if( Pos <= div ) Update(2 * nod, left, div);
	else Update(2 * nod + 1, div + 1, right);

	MaxArb[nod] = Maxim( MaxArb[2 * nod], MaxArb[2 * nod + 1] );
}

void Query(int nod, int left, int right)
{
	if( start <= left && right <= finish ) //Finds the MAX in a existentd interval
	{
		if( maxim < MaxArb[nod] ) maxim = MaxArb[nod];
		return;
	}
	int div = (left + right) / 2;
	if ( start <= div ) Query(2*nod,left,div);
    if ( div < finish ) Query(2*nod+1,div+1,right);
}