Cod sursa(job #544360)

Utilizator BitOneSAlexandru BitOne Data 1 martie 2011 15:31:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 400011

using namespace std;
int v[N_MAX];
int xIndex, xValue, Left, Right;
inline int _max( int x, int y ) { return ( x >= y ? x : y ); }
inline void Update( int vertex, int left, int right )
{
	if( left == right )
	{
		v[vertex]=xValue;
		return;
	}
	int middle=(left+right)/2;
	if( xIndex <= middle )
		Update( 2*vertex, left, middle );
	else Update( 2*vertex+1, middle+1, right );
	v[vertex]=_max( v[2*vertex], v[2*vertex+1] );
}
inline int Query( int vertex, int left, int right )
{
	if( left >= Left && right <= Right )
		return v[vertex];
	int middle=(left+right)/2, m=-1;
	if( Left <= middle )
		m=Query( 2*vertex, left, middle );
	if( Right > middle )
		m=_max( m, Query( 2*vertex+1, middle+1, right ) );
	return m;
}
int main( void )
{
	int N, M, i;
	ifstream in( "arbint.in" );
	in>>N>>M;
	for( i=1; i <= N; ++i )
	{
		in>>xValue;
		xIndex=i;
		Update( 1, 1, N );
	}
	ofstream out( "arbint.out" );
	for( ; M; --M )
	{
		in>>i;
		if( 1 == i )
		{
			in>>xIndex>>xValue;
			Update( 1, 1, N );
		}
		else {
				in>>Left>>Right;
				out<<Query( 1, 1, N )<<'\n';
			 }
	}
	return EXIT_SUCCESS;
}