Cod sursa(job #353823)

Utilizator ooctavTuchila Octavian ooctav Data 6 octombrie 2009 13:22:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>

int arb[280000],init[280000];
int n,m,x,y,tip,i;

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

void update(int pozitie,int val)
{
	int k=init[pozitie];
	arb[k]=val;
	for(k /= 2; k > 0 ; 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 )
	
	int mij = ( st + dr ) / 2;
	return max(caut(st,x,2*poz),caut(x+1,y,2*poz+1));
	
}

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