Cod sursa(job #664281)

Utilizator vitaminaXYZA.D.M. 2 vitaminaXYZ Data 19 ianuarie 2012 21:22:41
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream> 
#include<algorithm>
#define DIM 600001

using namespace std; 

ifstream in("arbint.in"); 
ofstream out("arbint.out"); 

long MaxArb[DIM], N, M, A, B, X, maxim; 

void Update(long nod, long left, long right, long pos, long val) 
{
	long mij;
	if(left == right) 
	{
		MaxArb[nod] = val; 
		return; 
	}
	else {
	mij= (left + right)/2; 
	if(pos <= mij) Update(2*nod,left,mij,pos,val); 
	else           Update(2*nod+1,mij+1,right,pos,val); 
	
	MaxArb[nod] = max(MaxArb[2*nod], MaxArb[2*nod+1]); 
	}
	
}
void Query(long nod, long left, long right, long A, long B) 
{
	long mij;
	if(A <= left && right <= B) 
	{
		if(MaxArb[nod] > maxim) 
			maxim = MaxArb[nod];
		return; 
	}
	if(left<right){
    mij = (left + right)/2;
	if(A <= mij)      Query(2*nod,left,mij,A,B); 
	else if(mij < B) Query(2*nod+1,mij+1,right,A,B);
	}
		
}
int main() 
{
	in >> N >> M; 
	
	for(int i = 1; i <= N; i++) 
	{
		in >> X; 
		Update(1,1,N,i,X);
	}
	
	for(int i = 1; i <= M; i++) 
	{
		in >> X >> A >> B; 
		if(X == 1) 
			Update(1,1,N,A,B); 
		else
		{
			X = 0;
			Query(1,1,N,A,B);
			out << maxim << '\n'; 
		}
	}
	
	return 0; 
}