Cod sursa(job #434634)

Utilizator alexandru92alexandru alexandru92 Data 6 aprilie 2010 12:46:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define Nmax 4000010

/*
 *
 */
using namespace std;
int Aint[Nmax];
int P, x, a, b;
inline const int& max( const int& x, const int& y )
{
	if( x > y )
		return x;
	return y;
}
inline void UpDate( int vertex, int left, int right )
{
	if( left == right )
	{
		Aint[vertex]=x;
		return;
	}
	int middle=left+(right-left)/2;
	if( P <= middle )
		UpDate( 2*vertex, left, middle );
	else UpDate( 2*vertex+1, middle+1, right );
	Aint[vertex]=max( Aint[2*vertex], Aint[2*vertex+1] );
}
inline int Query( int vertex, int left, int right )
{
	if( a <= left && right <= b )
		return Aint[vertex];
	int m=-1, middle=left+(right-left)/2;
	if( a <= middle )
		m=Query( 2*vertex, left, middle );
	if( b > middle )
		m=max( m, Query( 2*vertex+1, middle+1, right ) );
	return m;
}
int main( void )
{
	int N, M, i;
	ifstream in( "arbint.in" );
	ofstream out( "arbint.out" );
	in>>N>>M;
	for( P=1; P <= N; ++P )
	{
		in>>x;
		UpDate( 1, 1, N );
	}
	for( ; M; --M )
	{
		in>>i;
		if( !i )
		{
			in>>a>>b;
			out<<Query( 1, 1, N )<<'\n';
			continue;
		}
		in>>P>>x;
		UpDate( 1, 1, N );
	}
	return EXIT_SUCCESS;
}