Cod sursa(job #1096063)

Utilizator drobertDumitru Robert drobert Data 1 februarie 2014 14:48:01
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin( "arbint.in" );
ofstream cout( "arbint.out" );

int n, m, a, b, op, maxim, start, finish;
int v[ 1000001 ], pos, val;

void update( int nod,int st,int dr )
{
	int mij;
	if ( st == dr )
	{
		v[ nod ] = val;
		return;
	}
	mij = ( st + dr ) / 2;
	if ( pos <= mij ) update( 2 * nod,st,mij );
	else update( 2 * nod + 1,mij + 1,dr );
	v[ nod ] = max( v[ 2 * nod ],v[ 2 * nod + 1 ] );
}

void query( int nod,int st,int dr )
{
	int mij;
	if ( start <= st && dr <= finish )
	{
		if ( maxim < v[ nod ] ) maxim = v[ nod ];
		return;
	}
	mij = ( st + dr ) / 2;
	if ( start <= mij ) query( 2 * nod ,st,mij );
	if ( mij < finish ) query( 2 * nod + 1,mij + 1,dr );
}

int main()
{
	int i;
	cin >> n >> m;
	for ( i = 1; i <= n; i++ )
	{
		cin >> a;
		pos = i;
		val = a;
		update( 1,1,n );
	}
	for ( i = 1; i <= m; i++ )
	{
		cin >> op >> a >> b;
		if ( !op )
		{
			maxim = -1;
			start = a;
			finish = b;
			query( 1,1,n );
			cout << maxim << '\n';
		}
		else
		{
			pos = a;
			val = b;
			update( 1,1,n );
		}
	}
}