Cod sursa(job #567611)

Utilizator alutzuAlexandru Stoica alutzu Data 30 martie 2011 11:34:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>

int maxx ;

const int N = 100001;
int arb [ N*4 ] ;

int inline max ( int x , int y )
{
	if ( x > y )
		return x; 
	return y ;
}

void mod ( int nod , int p , int u , int x , int y )
{
	int m ;
	if ( p == u )
	{
		arb[nod]=y;
		return ;
	}
	m = ( p + u ) / 2 ;
	if ( x <= m )
		mod ( 2*nod , p , m , x , y ) ;
	else
		mod ( 2*nod+1 , m+1 , u , x , y ) ;
	arb[nod]= max ( arb[2*nod ] , arb[2*nod+1] ) ;
}

void cauta ( int nod , int p , int u , int x , int y )
{
	
	int m ;
	if ( x <= p && u <= y )
	{
		maxx = max ( maxx , arb[nod] ) ;
		return ;
	}
	m = ( p + u ) / 2 ;
	if ( x <= m )
	{
		cauta ( nod*2 , p , m , x , y ) ;
	}
	if ( m < y )
	{
		cauta ( 2*nod+1 , m+1 , u , x , y ) ;
	}
}

int main ( )
{
	
	freopen ( "arbint.in" , "r" , stdin ) ;
	freopen ( "arbint.out" , "w", stdout ) ;
	
	int n , m , x , i , a , b ;
	
	scanf ( "%d%d" , & n , & m ) ;
	
	for ( i = 1 ; i <= n ; ++ i )
	{
		scanf ( "%d" , & x ) ;
		mod ( 1 , 1 , n , i , x ) ;
	}
	for ( i = 1 ; i <= m ; ++ i )
	{
		scanf ( "%d%d%d" , & x , & a , & b ) ;
		if ( x )
			mod ( 1 , 1 , n , a , b ) ;
		else
		{
			maxx = -1 ;
			cauta ( 1 , 1 , n , a , b ) ;
			printf ( "%d\n" , maxx ) ;
		}
	}
	
	return 0 ;
}