Cod sursa(job #614956)

Utilizator BitOneSAlexandru BitOne Data 8 octombrie 2011 10:43:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 400011

using namespace std;
int v[N_MAX];
inline int _max( int x, int y ) { return x >= y ? x : y; }
inline void Update( int vertex, int left, int right, const int& xIndex, const int& xValue )
{
	if( left == right )
	{
		v[vertex]=xValue;
		return;
	}
	int middle=(left+right)>>1;
	if( xIndex <= middle )
		Update( vertex<<1, left, middle, xIndex, xValue );
	else Update( (vertex<<1)|1, middle+1, right, xIndex, xValue );
	v[vertex]=_max( v[vertex<<1], v[(vertex<<1)|1] ); 
}
inline int Query( int vertex, int left, int right, const int& a, const int& b )
{
	if( left >= a && right <= b )
		return v[vertex];
	int middle=(left+right)>>1, m1=-1, m2=-1;
	if( a <= middle )
		m1=Query( vertex<<1, left, middle, a, b );
	if( b > middle )
		m2=Query( (vertex<<1)|1, middle+1, right, a, b );
	return _max( m1, m2 );
}
int main( void )
{
	int N, M, i, x, a, b, op;
	ifstream in( "arbint.in" );
	in>>N>>M;
	for( i=1; i <= N; ++i )
	{
		in>>x;
		Update( 1, 1, N, i, x );
	}
	for( ofstream out( "arbint.out" ); M; --M )
	{
		in>>op>>a>>b;
		if( 0 == op )
			out<<Query( 1, 1, N, a, b )<<'\n';
		else Update( 1, 1, N, a, b );
	}
	return EXIT_SUCCESS;
}