Cod sursa(job #532050)

Utilizator SadmannCornigeanu Calin Sadmann Data 10 februarie 2011 19:19:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>
FILE *in,*out;
int N,M,poz,i,val,MaxArb[400100],X,max,A,B,start,finish;

void Update(int,int,int);
void Check(int,int,int);
inline int maxim(int a,int b)
{
	if(a>b)
		return a;
	return b;
}

int main()
{
	in=fopen("arbint.in","rt");
	out=fopen("arbint.out","wt");
	fscanf(in,"%d %d",&N,&M);
	for(i=1;i<=N;i++)
	{
		fscanf(in,"%d",&X);
		poz=i;
		val=X;
		Update(1,1,N);
	}
	
	for(i=1;i<=M;i++)
	{
		fscanf(in,"%d %d %d",&X,&A,&B);
		if(!X)
		{
			max=-1;
			start=A;
			finish=B;
			Check(1,1,N);
			fprintf(out,"%d\n",max);
		}
		else
		{
			poz=A;
			val=B;
			Update(1,1,N);
		}
	}
	return 0;
}

void Update(int nod, int left,int right)
{
	if(left==right)
	{
		MaxArb[nod]=val;
		return;
	}
	
	int div=(left+right)/2;
	if(poz<=div) Update(2*nod,left,div);
	else
		Update(2*nod+1,div+1,right);
	
	MaxArb[nod]=maxim(MaxArb[2*nod],MaxArb[2*nod+1]);
}

void Check(int nod,int left,int right)
{
	if(start<=left && finish>=right)
	{
		if(max<MaxArb[nod])
			max=MaxArb[nod];
		return;
	}
	
	int div=(left+right)/2;
	if(start<=div) 
		Check(nod*2,left,div);
	if(finish>div) 
		Check(nod*2+1,div+1,right);
}