Cod sursa(job #546017)

Utilizator david_raucaRauca Ioan David david_rauca Data 4 martie 2011 11:43:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<fstream>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int arb[400001];

int maxim, v, p, start, finish;
int n, m;

void Update( int nod, int st, int dr );
void Query( int nod, int st, int dr );

void Read();

int main()
{
	Read();
	
	fin.close();
	fout.close();
	
	return 0;
}

void Read()
{
	fin >> n >> m;
	int x;
	for( int i = 1; i <= n; ++i )
	{
		fin >> x;
		v = x;
		p = i;
		Update( 1, 1, n );
	}
	
	int t, a, b;
	/*
	for( int i = 1; i <= 9; ++i )
		fout << arb[i] << ' ';
	*/
	for( int i = 1; i <= m; ++i )
	{
		fin >> t >> a >> b;
		if( t == 1 )
		{
			p = a;
			v = b;
			Update( 1, 1, n );
		}
		else
		{
			start = a;
			finish = b;
			maxim = -999;
			Query( 1, 1, n );
			fout << maxim << '\n';
		}
	}
}

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

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