Cod sursa(job #664228)

Utilizator informatician28Andrei Dinu informatician28 Data 19 ianuarie 2012 20:25:32
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream> 
#define DIM 100001
#define maxim(a, b) (a > b)? a : b
using namespace std; 

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

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

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