Cod sursa(job #398808)

Utilizator ooctavTuchila Octavian ooctav Data 19 februarie 2010 13:56:43
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
// arbint.cpp : Defines the entry point for the console application.
#include <cstdio>
#define in "arbint.in"
#define out "arbint.out"
#define NMAX 100001

int N,M;
int Arb[2*NMAX];
int val,poz;
int x1,x2;
int max;

void aflare(int el,int st,int dr);
void update(int el,int st,int dr);



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



void citire()
{
	int a,x,y;
	scanf("%d %d",&N,&M);
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&val);
		poz=i;
		update(1,1,N);
	}
	for(int i=1;i<=M;i++)
	{
		scanf("%d %d %d",&a,&x,&y);
		if(!a)
		{
			max=-1;
			x1=x;
			x2=y;
			aflare(1,1,N);
			printf("%d\n",max);
		}
		else
		{
			poz=x;
			val=y;
			update(1,1,N);
		}
	}
}



int main()
{
	freopen(in,"r",stdin);
	freopen(out,"w",stdout);
	citire();

	return 0;
}



void aflare(int el,int st,int dr)
{
	if(x1<=st && dr<=x2)
	{
		if(max<Arb[el])
			max=Arb[el];
		return;
	}
	int mij=(st+dr)/2;
	if(x1<=mij)
		aflare(2*el,st,mij);
	if(mij+1<=x2)
		aflare(2*el+1,mij+1,dr);
	
}



void update(int el,int st,int dr)
{
	if(st==dr)
	{
		Arb[el]=val;
		return;
	}
	int mij=(st+dr)/2;
	if(poz<=mij)
		update(2*el,st,mij);
	else
		update(2*el+1,mij+1,dr);
	Arb[el]=maxim(Arb[2*el],Arb[2*el+1]);
}