Cod sursa(job #562630)

Utilizator avram_florinavram florin constantin avram_florin Data 23 martie 2011 16:50:42
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
#include<cstdio>

using namespace std;

const int MaxN = 110001;

int n,m,st,dr,max1,val,poz,Arb[MaxN];

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

void update(int nod,int left,int right)
{
	if( left == right )
		{
			Arb[nod] = val;
			return ;
		}
	int midd = (left+right)>>1;
	if( poz <= midd )
		update(2*nod,left,midd);
		else
		update(2*nod+1,midd+1,right);
	Arb[nod] = maxim(Arb[2*nod],Arb[2*nod+1]);
}

void query(int nod , int left,int right )
{
	if( st <= left && right <= dr )
		{
			max1 = maxim(max1,Arb[nod]);
			return ;
		}
	int midd = (left+right)>>1;
	if( st <= midd )
		query(2*nod,left,midd);
	if( midd < dr )
		query(2*nod+1,midd+1,right);
}

int main()
{
	freopen("arbint.in" , "r" , stdin);
	freopen("arbint.out" , "w" , stdout);
	scanf("%d%d" , &n , &m);
	int i,x;
	for( i = 1 ; i <= n ; i++ )
		{
			scanf("%d" , &x );
			poz = i;
			val = x;
			update(1,1,n);
		}
	int op,a,b;
	for(  i = 1 ; i <= m ; i++ )
		{
			scanf("%d%d%d" , &op , &a, &b );
			if( !op )
				{
					st = a;
					dr = b;
					max1 = -1;
					query(1,1,n);
					printf("%d\n" , max1 );
				}
				else
				{
					poz = a;
					val = b;
					update(1,1,n);
				}
		}
	return 0;
}