Cod sursa(job #404288)

Utilizator BaduBadu Badu Badu Data 25 februarie 2010 23:53:04
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>
#define max 100005
using namespace std;

int v[max],MAX;
int A[4*max];
int n,m;

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

void UPDATE( int nod, int i, int j,int poz, int val){
	
	int mij;
	if ( i>=j) {A[nod] = val;return;}
	
	mij = ( i+j )/2;
	
	if( poz <= mij ) UPDATE( nod*2 , i, mij, poz, val);
	else UPDATE( nod*2 + 1 , mij+1, j, poz, val);
	
	A[ nod ] = maxim ( A[ nod*2] , A[ nod*2 + 1] );

}

void QUERY( int nod, int st, int dr, int i, int j){
	
	if( i<=st && dr<=j ) { MAX = maxim( MAX, A[nod] );return; }
	
	int mij = ( st + dr ) / 2;
	
	if( i <= mij ) QUERY( nod*2 , st, mij, i, j);
	if( j > mij  ) QUERY( nod*2 + 1 , mij+1, j, i, j);
}

int main(){
	
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	
	f>>n>>m;
	int i,o,a,b;
	for( i=1; i<=n; i++) { f>>v[i]; UPDATE(1,1,n,i,v[i]); }
	
	for( ; m-- ; ){
		
		f>>o>>a>>b;
		if( o ) UPDATE( 1, 1, n, a, b);
		else{
			
			MAX = -1;
			QUERY( 1, 1,n,a,b);
			g<<MAX<<'\n';
		}
	}
	return 0;
}