Cod sursa(job #177084)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 12 aprilie 2008 11:26:16
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define TREE_MAX 1 << 17
#define NMAX 100001
#define FIN "arbint.in"
#define FOUT "arbint.out"
#define INFINIT -2


int TREE[TREE_MAX], V[NMAX], ind, tip, value, M, N, ans, x, y;
FILE * fin, * fout;

int MAX( int a, int b )
{
	return a > b ? a : b;
}

void build( int nod, int left, int right )
{
	int half;
	
	if( left == right )
		TREE[nod] = V[left];
	else
	{
		half = ( left + right ) >> 1;
		build( 2 * nod, left, half );
		build( 2* nod + 1, half + 1, right );
		TREE[nod] = MAX( TREE[2*nod], TREE[2*nod+1]);	
	}
}

void query( int nod, int left, int right )
{
	int half;
	if ( x <= left && y >= right )
		ans = MAX( ans, TREE[nod] );
	else
	{
		half = ( left + right ) >> 1;
		if ( x <= half )
			query( 2 * nod, left, half );
		if ( y > half )
				query( 2 * nod + 1, half + 1, right );
	}
}

void update( int nod, int left, int right )
{
	int half;
	
	if ( left == right )
		TREE[nod] = V[left];
	else
	{
		half = ( left + right ) >> 1;
		if ( ind <= half )
			update( 2 * nod, left, half );
			else
				update( 2 * nod + 1, half + 1, right );
		TREE[nod] = MAX( TREE[2*nod], TREE[2*nod+1]);
		
	}
		
}

int main()
{
	fin = fopen( FIN, "r" );
	fout = fopen( FOUT, "w" );
	fscanf( fin, "%d%d", &N, &M);
	for( int i = 1; i <= N; i++ )
		fscanf( fin, "%d", V+i );
	build( 1, 1, N );
	while( M )
	{
		fscanf( fin, "%d%d%d", &tip, &ind, &value );
		if( !tip )
		{
			x = ind; y = value; ans = INFINIT;
			query( 1, 1, N );
			fprintf( fout, "%d\n", ans);
		}
		else
		{
			V[ind] = value;
			update( 1, 1, N);
		}
		M--;
	}
	fclose( fin );
	fclose( fout );
	return 0;
}