Cod sursa(job #353829)

Utilizator mottyMatei-Dan Epure motty Data 6 octombrie 2009 13:29:15
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<cstdio>

int n,x,y,tip,i,m;

inline int mij( int x,int y )
{
	return (x+y)/2;
}

inline int max( int x,int y )
{
	return ( x>y ? x:y) ;
}

const int N=280001;

int arb[N],init[N];

void build( int st , int dr , int poz )
{
	int mj=mij(st,dr);
	if( st==dr )
	{
		init[st]=poz;
		return;
	}
	build(st,mj,2*poz);
	build(mj,dr,2*poz+1);
}

void up(int poz,int val)
{
	int k=init[poz];
	arb[k]=val;
	for( k/=2 ; k ; k/=2 )
		arb[k]= max(arb[2*k],arb[2*k+1]) ;
}

int caut( int st,int dr,int poz )
{
	if( x<=st && dr<=y )
		return arb[poz];
	if( st>y || dr<x )
		return 0;
	int x=(st+dr)/2;
	return max(caut(st,x,2*poz),caut(x+1,dr,2*poz+1));
}

int main()
{
	freopen("arb.in","r",stdin);
	freopen("arb.out","w",stdout);
	scanf("%d",&n);
	scanf("%d",&m);
	build(1,n,1);
	for( int i=1 ; i<=n ; ++i )
	{
		scanf("%d",&x);
		up(i,x);
	}
	for( int i=1 ; i<=m ; ++i )
	{
		scanf("%d%d%d",&tip,&x,&y);
		if(tip==0)
			up(x,y);
		else
			printf("%d\n",caut(1,n,1));
	}
	return 0;
}