Cod sursa(job #2129935)

Utilizator PostMaloneLiurca Daniel PostMalone Data 13 februarie 2018 11:54:38
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;

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

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

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 n = left + (right - left)/2;
	
	if(Pos <= n)
		Update(2*nod, left, n);
	else
		Update(2*nod + 1, n + 1, right);
		
	MaxArb[nod] = Maxim(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}

void Search(int nod, int left, int right)
{
	if(start <= left && right <= finish)
	{
		if(maxim < MaxArb[nod])
			maxim = MaxArb[nod];
		return;
	}
	
	int n = left + (right - left)/2;
	
	if(start <= n)
		Search(2*nod, left, n);
	else
		Search(2*nod + 1, n + 1, right);
}

int main()
{
	int X, A, B;
	
	input >> N >> M;
	for(int i = 0; i < N; i++)
	{
		input >> X;
		Pos = i;
		Val = X;
		Update(1, 1, N);
	}
	
	for(int i = 0; i < M; i++)
	{
		input >> X >> A >> B;
		if(X == 0)
		{
			maxim = - 1;
			start = A;
			finish = B;
			Search(1, 1, N);
			
			output << maxim << "\n";
		}
		else
		{
			Pos = A;
			Val = B;
			Update(1, 1, N);
		}
	}
	
	return 0;
}