Cod sursa(job #664264)

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

using namespace std; 

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

int MaxArb[4*DIM+66];
int pos, val, N, M, maxim, Start, Finish; 

void Update(int nod, int left, int right) 
{
	if(left == right) 
	{
		MaxArb[nod] = val; 
		return; 
	}
	
	int div = (left + right)/2; 
	if(pos <= div) Update(2*nod,left,div); 
	else           Update(2*nod+1,div+1,right); 
	
	MaxArb[nod] = max(MaxArb[2*nod], MaxArb[2*nod+1]); 
	
}
void Query(int nod, int left, int right) 
{
	if(Start <= left && right <= Finish) 
	{
		maxim = max(maxim, MaxArb[nod]); 
		return; 
	}
	
    int div = (left + right)/2;
	if(Start <= div)      Query(2*nod,left,div); 
	else if(div < Finish) Query(2*nod+1,div+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); 
		}
	}
	
	return 0; 
}