Cod sursa(job #971576)

Utilizator bugyBogdan Vlad bugy Data 9 iulie 2013 17:01:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
using namespace std;
#define dim 100001

int maxim, start, finish, MaxArb[ 4 * dim ];	

inline int Maxim ( int a, int b )
{
    if ( a > b ) return a;
    return b;
}

void Update ( int nod, int left, int right, int Pos, int x )
{
	if ( left == right )
	{
		MaxArb[nod] = x;
		return ;	
	}
	
	int mij = ( left + right ) / 2;
	
	if ( Pos <= mij )
		Update( 2 * nod, left, mij, Pos, x);
	else
		Update( 2 * nod + 1, mij + 1, right, Pos, x);
	
	MaxArb[ nod ] = Maxim( MaxArb[ 2 * nod ], MaxArb[ 2 * nod + 1 ] );
}

void Query ( int nod, int left, int right )
{
	if ( start <= left && right <= finish )
	{
		if ( maxim < MaxArb[ nod ] )
			maxim = MaxArb[ nod ];
		return ;
	}
		
	int mij = ( left + right ) / 2;
	if ( start <= mij ) 
		Query(2 * nod, left, mij);
	if ( mij < finish )
		Query(2 * nod +1, mij + 1, right);	
}

int main ()
{	
	int i, x, t, a, b, N, M;
	FILE *f = fopen ( "arbint.in","r" ), *g = fopen ( "arbint.out","w" );

	fscanf( f,"%d %d", &N, &M );
	
	
	for ( i = 1; i <= N; ++i )
	{
		fscanf ( f,"%d", &x );
		Update ( 1, 1, N, i,x );
	}
	
	for ( i = 1; i <= M; ++i )
	{
		fscanf ( f,"%d %d %d", &t, &a, &b );
		if ( t == 0 )
		{	
			maxim = -1;
			start = a;
			finish = b;
			Query ( 1, 1, N );
			fprintf ( g,"%d\n", maxim);
		}
		else
			Update ( 1, 1, N, a, b );	
	}
	
fclose ( f );
fclose ( g );
return 0;
}