Cod sursa(job #587765)

Utilizator V74Dvlad dalv V74D Data 5 mai 2011 20:05:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
//arbore de intervale
#include<cstdio>

int I[600000];
int N,M,valoare,pos,maxim,A,B,o,s,f;

FILE *in = fopen("arbint.in","r");
FILE *out = fopen("arbint.out","w");

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

void update( int nod, int start, int finish )
{
	if( start >= finish ) 
	{
		I[nod] = valoare;
		return;
	}

	int mid = (start+finish)/2;
	if( pos <= mid  ) update( 2 * nod, start, mid );
	else update( 2 * nod + 1, mid+1,finish );

	I[ nod ] = max( I[ 2*nod ] , I[ 2 * nod + 1] );
}

void query( int nod, int start, int finish  )
{

	if( s <= start && finish <= f )
	{
		if ( maxim < I[ nod ] ) maxim = I[ nod ]; 
		return;
	}	
	

	int mid = (start+finish)/2;
	if( s <= mid ) query ( 2*nod, start, mid );
	if( f > mid) query ( 2*nod + 1, mid+1, finish );
}

int main()
{

	fscanf(in,"%d %d",&N,&M);
	
	for( int i=1; i<=N;++i)
	{
		fscanf( in,"%d",&valoare);
		pos = i;
		update( 1, 1, N);
	}

	for( int i = 1; i<= M; ++i )
	{

		fscanf(in,"%d %d %d",&o,&A,&B);
		if( !o )
		{
			s = A;
			f = B;
			maxim = -1;

			query( 1, 1, N );

			fprintf(out,"%d\n",maxim);
		}
		else
		{
			pos = A;
			valoare = B;
			update( 1,1,N );
		}
	}

	return 0;
}