Cod sursa(job #423950)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 24 martie 2010 14:27:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <algorithm>
#include <fstream>

#define INF (2000000000)
#define MIJ ((st+dr)/2)

using namespace std;

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

int arb[202000],x[102000],i,j,a,b,op,maxim,frunze[102000],n,m;

void set_frunze(int nod, int st, int dr)
{
	if(st == dr)
		frunze[st] = nod;
	else if(st < dr)
		set_frunze(2*nod, st, MIJ),
		set_frunze(2*nod+1, MIJ+1, dr);

}

void query(int nod, int st, int dr, int ist, int idr)
{
	if(st > idr || dr < ist)
		return;
	if(ist <= st && idr >= dr)
	{
		if(maxim < arb[nod])
			maxim = arb[nod];
		return;
	}

	if(!(st > idr || MIJ < ist))
		query(2*nod, st, MIJ, ist, idr);
        if(!(MIJ+1 > idr || dr < ist))
		query(2*nod+1, MIJ+1, dr, ist, idr);
}

void update(int pos)
{
	int nod = frunze[pos];
	int st,dr, m;
	st = dr = pos;
	arb[nod] = x[pos];
	nod/=2;
	while(nod>=1)
		arb[nod] = max(arb[2*nod], arb[2*nod+1]), nod/=2;
}

int main()
{
	in>>n>>m;

	set_frunze(1, 1, n);

	for(i=1; i<=n; i++)
		in>>x[i], update(i);

	for(i=1; i<=m; i++)
	{
		in>>op>>a>>b;
		if(op == 0)
		{
			maxim = -INF;
			query(1, 1, n, a, b);
			out<<maxim<<'\n';
		}
		else
		{
			x[a] = b;
			update(a);
		}
	}

	return 0;
}