Cod sursa(job #829862)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 5 decembrie 2012 22:09:51
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <cstdlib>

int max[500000];
int N,M,aaa;


int maxim ( int a , int b )
{
	if ( a > b )	return a;
		else return b;
}

void update ( int nod , int st , int dr , int pos , int val )
{
	if ( st == dr )	max[nod] = val;
		else
		{
			int mij = ( st + dr )/2;
			if ( pos <= mij ) update ( nod*2 , st , mij , pos , val );
				else	update ( nod*2+1 , mij + 1 , dr , pos , val );
			max[nod] = maxim ( max[2*nod] , max[2*nod+1] );
		}

}

void qasd ( int nod , int a , int b , int st ,int dr )
{
	if ( a <= st && dr <= b )
	{
        aaa = max[nod];
		return;
	}

		else
		{
			int mid = ( st + dr )/2;
			if ( a <= mid  )	qasd ( 2*nod , a , b , st , mid  );
                else if ( mid < b )     qasd ( 2*nod+1 , a , b , mid+1 , dr );
		}

}
int main ()
{
	FILE *fin,*fout;
	fin = fopen ( "arbint.in" , "r" );
	fout = fopen ( "arbint.out" , "w" );

	fscanf ( fin , "%d %d" , &N , & M );

	int asd;
	for ( int i = 1 ; i <= N ; i++  )
	{
		fscanf ( fin , "%d" , &asd );
		update ( 1 , 1 , N , i , asd  );
	}


	int op , a , b;
	for ( int i = 1 ; i <= M ; i++ )
	{
		fscanf ( fin , "%d %d %d" , &op , &a , &b );
        if ( op == 0 )
		{
            qasd ( 1 , a , b , 1 , N );

			fprintf ( fout , "%d\n" , aaa );
			continue;
		}
		if ( op == 1 )
			update ( 1 , 1 , N , a , b );

	}


    fclose( fin );
    fclose ( fout );
	return 0;
}