Cod sursa(job #732504)

Utilizator danalex97Dan H Alexandru danalex97 Data 10 aprilie 2012 15:44:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;

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

#define Nmax 100000
#define max(a,b) ( (a>b) ? a : b )
#define min(a,b) ( (a<b) ? a : b )
int N,Q;

typedef int ArbInt[Nmax*4+66]; 
typedef int Aux;

ArbInt A; 
Aux Begin,End,Pos,Val,Max;

void Update(int,int,int);
void Query(int,int,int);

int main()
{
	F>>N>>Q;
	
	for (int i=1;i<=N;++i)
	{
		F>>Val,Pos=i;
		Update(1,1,N);
	}
	
	for (int i=1;i<=Q;++i)
	{
		int chr;
		F>>chr;
		switch (chr)
		{
			case 0:
				Max=-1;
				F>>Begin>>End;
				Query(1,1,N);
				G<<Max<<'\n';
				break;
			case 1:
				F>>Pos>>Val;
				Update(1,1,N);
				break;
		}
	}
	
	F.close();
	G.close();
	return 0;
}

void Update(int Nod,int St,int Dr)
{
	if ( St==Dr )
	{
		A[Nod]=Val;
		return;
	}
	
	int Mid= (St+Dr) /2;
	if ( Pos<=Mid )
		Update(2*Nod,St,Mid);
	else
		Update(2*Nod+1,Mid+1,Dr);
	
	A[Nod]=max(A[2*Nod],A[2*Nod+1]);
}

void Query(int Nod,int St,int Dr)
{
	if ( Begin<=St && Dr<=End )
	{
		Max=max(Max,A[Nod]);
		return;
	}
	
	int Mid= (St+Dr) /2; 
	if ( Begin <=Mid ) 
		Query(2*Nod,St,Mid);
	if ( Mid< End )
		Query(2*Nod+1,Mid+1,Dr);
}