Cod sursa(job #597290)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 21 iunie 2011 17:37:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int N, X[100005], ArbInt[410010];

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

int BuildArbInt (int L, int R, int K)
{
	int M;
	M=(L+R)/2;
	if (L==R)
	{
		ArbInt[K]=X[M];
		return ArbInt[K];
	}
	ArbInt[K]=Max (BuildArbInt (L, M, 2*K), BuildArbInt (M+1, R, 2*K+1));
	return ArbInt[K];
}

void Update (int L, int R, int X, int Y, int K)
{
	int M;
	M=(L+R)/2;
	if (L==R)
	{
		ArbInt[K]=Y;
		return;
	}
	if (X<=M)
	{
		Update (L, M, X, Y, 2*K);
	}
	else
	{
		Update (M+1, R, X, Y, 2*K+1);
	}
	ArbInt[K]=Max (ArbInt[2*K], ArbInt[2*K+1]);
}

int Query (int L, int R, int QL, int QR, int K)
{
	int M;
	M=(L+R)/2;
	if (L==QL and R==QR)
	{
		return ArbInt[K];
	}
	if (QR<=M)
	{
		return Query (L, M, QL, QR, 2*K);
	}
	if (QL>M)
	{
		return Query (M+1, R, QL, QR, 2*K+1);
	}
	return Max (Query (L, M, QL, M, 2*K), Query (M+1, R, M+1, QR, 2*K+1));
}

int main ()
{
	int M, i, Tip, A, B;
	fin >> N >> M;
	for (i=1; i<=N; ++i)
	{
		fin >> X[i];
	}
	BuildArbInt (1, N, 1);
	for (; M>0; --M)
	{
		fin >> Tip >> A >> B;
		if (Tip==0)
		{
			fout << Query (1, N, A, B, 1) << "\n";
		}
		else
		{
			Update (1, N, A, B, 1);
		}
	}
	fin.close ();
	fout.close ();
	return 0;
}