Cod sursa(job #175153)

Utilizator amadaeusLucian Boca amadaeus Data 9 aprilie 2008 17:17:38
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>

#define NX 131072
#define INF 0x3f3f3f3f

int N, v[ NX ], T[ NX*2 ], x, y;

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

void build( int n, int l, int r ) {
	int nn, m;
	
	if( l == r )
		T[n] = v[l];
	else {
		m = (l+r) >> 1; nn = n << 1;

		build( nn, l, m );
		build( nn + 1, m+1, r );

		T[ n ] = max( T[nn], T[nn + 1] );
	}
}

void upd( int n, int l, int r ) {
	int m, nn;
	
	if( l == r )
		T[n] = y;
	else {
		m = (l + r) >> 1; nn = n << 1;
		if( x <= m )
			upd( nn, l, m );
		else
			upd( nn+1, m+1, r );
		T[ n ] = max( T[ nn ], T[ nn+1 ] );
	}
}

int query( int n, int l, int r ) {
	int m, nn, q;
	
	if( l >= x && r <= y )
		return T[n];
	else {
		m = (l+r) >> 1; nn = n << 1;
		q = -INF;
		if( m >= x )
			q = max( q, query( nn, l, m ) );
		if( m < y )
			q = max( q, query( nn+1, m+1, r ) );
		return q;
	}
}

void cit() {
	int M, i, op;
	
	scanf( "%d%d", &N, &M );

	for( i = 1; i <= N; i++ )
		scanf( "%d", v+i );

	build( 1, 1, N );

	while( M-- ) {
		scanf( "%d%d%d", &op, &x, &y );
		if( op == 1 )
			upd( 1, 1, N );
		else
			printf( "%d\n", query( 1, 1, N ) );
	}
	
}

int main() {
	freopen( "arbint.in", "r", stdin );
	freopen( "arbint.out", "w", stdout );

	cit();

	return 0;
}