Cod sursa(job #447825)

Utilizator alexeiIacob Radu alexei Data 1 mai 2010 10:46:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
//Atestat work//

#include<stdio.h>
#define NMAX 100000

int A[NMAX*4+64];

int pos,val;
int p1,p2;
int ans;

//SIGSEGV?? dubios. merge pe teste.
// testing stuff..

inline int max( const int a, const int b)
{
	return a>b?a:b;
}

void update( int nod, int left, int right )
{
	if( left==right )
	{
		A[nod]=val;
		return;
	}
	else
	{
		int mij=(left+right)>>1;
		int aux=nod<<1;
		
		if( pos<=mij ) update( aux, left, mij );
		else update( aux+1, mij+1, right );
	
		A[nod]=max( A[aux], A[aux+1] );
	}
}

void query( int nod, int left, int right )
{
	if( left>=p1 && right<=p2 )
	{
		ans=max( ans, A[nod] );
		return;
	}
	if( left>p2 || right<p1 || left==right ) return;
	
	int mij=(left+right)>>1;
	int aux=nod<<1;
	
	query( aux, left, mij );
	query( aux+1, mij+1, right );
}
	
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	
	int N,M;
	scanf("%d%d",&N,&M);
	
	int i;
	for(i=1; i<=N; ++i)
	{
		pos=i; 
		scanf("%d",&val);
		update( 1, 1, N );
	}
	
	int ok;
	while( M-- )
	{
		scanf("%d",&ok);
		
		if( ok )
		{
			scanf("%d%d",&pos,&val);
			update( 1, 1, N );
		}
		else
		{
			ans=-1;
			scanf("%d%d",&p1,&p2);
			query( 1, 1, N );
			printf("%d\n",ans);
		}
	}
	
	return 0;
}