Cod sursa(job #412883)

Utilizator vlad2179Popescu Vlad Alexandru vlad2179 Data 6 martie 2010 20:31:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
#define max 100005
using namespace std;

int v[max],MAX;
int A[4*max];
int n,m,val,poz,AA,B;

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

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

}

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

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]; poz=i; val = v[i];UPDATE(1,1,n); }
	
	for( ; m-- ; ){
		
		f>>o>>a>>b;
		if( o ){val=b;poz=a; UPDATE( 1, 1, n);}
		else{
			
			MAX = -1;
			AA=a;
			B=b;
			QUERY( 1, 1,n);
			g<<MAX<<'\n';
		}
	}
	return 0;
}