Cod sursa(job #664289)

Utilizator vitaminaXYZA.D.M. 2 vitaminaXYZ Data 19 ianuarie 2012 21:33:58
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
#include<assert.h>
#define dim 100001

using namespace std; 

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

int MaxArb[4*dim+66];
int N,M; 
int start, finish, Pos, Val, maxim; 

inline int Maxim(int a, int b) 
{
	if(a > b) return a; 
	return b; 
}
void Update(int nod, int left, int right) 
{
	if(left == right) 
	{
		MaxArb[nod] = Val; 
		return; 
	}
	
	int mij = (left + right)/2; 
	if(Pos <= mij) Update(2*nod,left,mij); 
	else           Update(2*nod+1,mij+1,right); 
	
	MaxArb[nod] = Maxim(MaxArb[2*nod], MaxArb[2*nod+1]); 
	
	
}
void Query(int nod, int left, int right) 
{
	if(start <= left && right <= finish) 
	{
		if(MaxArb[nod] > maxim) 
			maxim = MaxArb[nod];
		return; 
	}
	
    int mij = (left + right)/2;
	if( start <= mij)     Query(2*nod,left,mij); 
	else if(mij < finish) Query(2*nod+1,mij+1,right);
	
		
}
int main() 
{
	int X, A, B; 
	
	in >> N >> M; 
	
	for(int i = 1; i <= N; i++) 
	{
		in >> X; 
		Pos = i, Val = X;
		Update(1,1,N);
	}
	
	for(int i = 1; i <= M; i++) 
	{
		in >> X >> A >> B; 
		if(X == 0) 
		{
			start = A, finish = B;
            maxim = -1;			
			Query(1,1,N); 
			out << maxim << '\n';
		}
		else 
		{
			Pos = A; 
			Val = B;
            Update(1,1,N);
		}
	}
}