Cod sursa(job #563122)

Utilizator 0x69NoName 0x69 Data 24 martie 2011 15:05:08
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#define nmax 100005

using namespace std;

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

int arb[2*nmax + 1], a, b, n, k, cod, maxed;

inline int maxim(int x, int y)
{
	if(x > y)
		return x;
	return y;
}

void query(int nod, int st, int dr)
{
	if(a <= st && dr <= b)
	{
		if(maxed < arb[nod])
			maxed = arb[nod];
		return;
	}
	int m = (st+dr)/2;
	if(a <= m) query(2*nod, st, m);
	if(m < b)   query(2*nod + 1, m+1, dr);
}

void update(int nod, int st, int dr)
{
	if(st == dr)
	{
		arb[nod] = b;
		return ;
	}
	int m = (st+dr)/2;
	if(a <= m) update(2*nod, st, m);
	else 	update(2*nod + 1, m+1, dr);

	arb[nod] = maxim(arb[2*nod], arb[2*nod+1]);
}

int main()
{
	int i, v;
	fin >> n >> k;
	for(i = 1; i <= n; ++ i)
	{
		fin >> v;
		a = i;
		b = v;
		update(1, 1, n);
	}
	for(i = 1; i <= k; ++ i)
	{
		fin >> cod >> a >> b;
		if(cod == 0)
		{
			maxed = -1;
			query(1, 1, n);
			fout << maxed << "\n";
		}
		else
			update(1, 1, n);
	}
	return 0;
}