Cod sursa(job #540563)

Utilizator zizou_adyIacov Adrian zizou_ady Data 24 februarie 2011 01:29:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
using namespace std;

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

#define DIM 100001

int m, n;

int arb[4*DIM];
int inc, sf, maxim, val, poz;

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

int main()
{
	Read();
	int x, y, v;
	for ( int i = 1; i <= m; ++i )
	{
		fin >> v >> x >> y;
		if ( v == 0 )
		{
			maxim = -1;
			inc = x;
			sf = y;
			Query (1, 1, n);
			fout << maxim << '\n';
		}
		else
		{
			poz = x;
			val = y;
			Update(1, 1, n);
		}
	}
}

void Read()
{
	int x;
	fin >> n >> m;
	for ( int i = 1; i <= n; ++i )
	{
		fin >> x;
		poz = i, val = x;
		Update(1, 1, n);
	}
}

void Update(int nod, int st, int dr)
{
    if (st == dr)
	{
		arb[nod] = val;
		return;
	}
     
    int mij = (st + dr)/2;
    if ( poz <= 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 ( inc <= st && dr <= sf )
    {
		if ( maxim < arb[nod] ) 
			maxim = arb[nod];
		return;
    }
      
    int mij = (st+dr)/2;     
	if ( inc <= mij ) 
		Query( 2*nod, st, mij);
    if ( mij < sf ) 
		Query( 2*nod+1, mij+1, dr);
}