Cod sursa(job #184554)

Utilizator amadaeusLucian Boca amadaeus Data 23 aprilie 2008 20:44:00
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>

#define NX (1<<17)
#define TX (1<<18)

int a[ NX ], T[ TX ], N, M, X, Y;

void build( int n, int l, int r ) {
	if( l==r )
		T[n] = l;
	else {
		int st = n<<1, m = (l+r)>>1;
		
		build( st, l, m );
		build( st+1, m+1, r );
		T[n] = ( a[ T[st] ] >= a[ T[st+1] ] ) ? T[st] : T[st+1];
	}
}

void upd( int n, int l, int r ) {
	if( l==r )
		a[X] = Y;
	else {
		int st = n<<1, m = (l+r)>>1;

		if( X <= m )
			upd( st, l, m );
		else
			upd( st+1, m+1, r );
		T[n] = ( a[ T[st] ] >= a[ T[st+1] ] ) ? T[st] : T[st+1];
	}
}

int que( int n, int l, int r ) {
	if( X <= l && r <= Y )
		return T[n];
	else {
		int st = n<<1, m = (l+r)>>1, p1, p2;
		
		p1 = p2 = 0;
		if( X <= m )
			p1 = que( st, l, m );
		if( m < Y )
			p2 = que( st+1, m+1, r );
		return ( a[p1] >= a[p2] ) ? p1 : p2;
	}
}

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

	scanf( "%d%d", &N, &M );

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

	build( 1, 1, N );

	while( M-- ) {
		scanf( "%d%d%d", &op, &X, &Y );
		if( op )
			upd( 1, 1, N );
		else
			printf( "%d\n", a[ que(1, 1, N) ] );
	}
	
	return 0;
}