Cod sursa(job #616325)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 12 octombrie 2011 11:59:42
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>
#define NMAX 100010
#define MMAX 200010

using namespace std;

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

int x[NMAX], a[MMAX], pz[NMAX], n, m, mx;

void Citeste()
{
	int i;
	f>>n>>m;
	for (i=1; i<=n; ++i) f>>x[i];
}

void Formeaza(int st, int dr, int nod)
{
	int mij=(st+dr)/2;
	
	if (st==dr) a[nod]=x[dr], pz[dr]=nod;
	else
	{
		Formeaza(st, mij, nod*2);
		Formeaza(mij+1, dr, nod*2+1);
		a[nod]=max(a[nod*2], a[(nod*2)+1]);
	}
}

void Upgrade(int xx, int yy)
{
	int j;
	
	x[xx]=yy;
	a[pz[xx]]=yy;
	j=pz[xx]/2;
	
	while (j>0) a[j]=max(a[j*2], a[(j*2)+1]), j/=2;
}

void Query(int st, int dr, int xx, int yy, int nod)
{
	int mij=(st+dr)/2;
	if (st==dr && xx<=st && yy>=st) mx=max(mx, a[nod]);
	else
	{
		if (xx<=mij) Query(st, mij, xx, yy, 2*nod);
		if (yy>mij) Query(mij+1, dr, xx, yy, (2*nod)+1);
	}
}

void Solve()
{
	int op, xx, yy, i;
	
	for (i=1; i<=m; ++i)
	{
		f>>op>>xx>>yy;
		
		if (op) Upgrade(xx, yy);
		else 
		{
			mx=0;
			Query(1, n, xx, yy, 1);
			g<<mx<<"\n";
		}
	}
}

int main()
{
	Citeste();
	
	Formeaza(1, n, 1);
	
	Solve();
	
	f.close();
	g.close();
	return 0;
}