Cod sursa(job #1340072)

Utilizator BLz0rDospra Cristian BLz0r Data 11 februarie 2015 15:06:33
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 200002
#define L(x) ( (x) << 1 )
#define R(x) ( (x) << 1 ) + 1

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

int Aint[Nmax];

int Query ( int nod, int st, int dr, int a, int b ){
	if ( a <= st && dr <= b )
		return Aint[nod];
	
	int mid = ( st + dr ) >> 1;
	int x1 = -1, x2 = -1;
	
	if ( a <= mid )
		x1 = Query ( L ( nod ), st, mid, a, b );
	if ( b > mid )
		x2 = Query ( R ( nod ), mid + 1, dr, a, b );

	return max ( x1, x2 );
}

void Update (  int nod, int st, int dr, int poz, int val ){
	if ( st >= poz && dr <= poz ){
		Aint[nod] = val;
		return;
	}
	
	int mid = ( st + dr ) >> 1;
	
	if ( poz <= mid )
		Update ( L ( nod ), st, mid, poz, val );
	else
		Update ( R ( nod ), mid + 1, dr, poz, val );
	
	Aint[nod] = max ( Aint[ L(nod) ], Aint[ R(nod) ] );
}

int main(){
	int N, M, op, a, b, x;
	
	fscanf ( f, "%d%d", &N, &M );
	
	for ( int i = 1; i <= N; ++i ){
		fscanf ( f, "%d", &x );
		Update ( 1, 1, N, i, x );
	}
	
	for ( int i = 1; i <= M; ++i ){
		fscanf ( f, "%d%d%d", &op, &a, &b );
		
		if ( op == 0 )
			fprintf ( g, "%d\n", Query ( 1, 1, N, a, b ) );
		
		else
			Update ( 1, 1, N, a, b );
		
	}
	
	return 0;
}