Cod sursa(job #1087405)

Utilizator pulseOvidiu Giorgi pulse Data 19 ianuarie 2014 13:16:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#define NMAX 100001
using namespace std;

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

int N, M, arb[4 * NMAX + 66], start, finish, val, pos, maxim;

inline int Maxim (int a, int b)
{
	if (a > b) return a;
	else return b;
}

void Update (int nod, int l, int r)
{
	if (l == r)
	{
		arb[nod] = val;
		return;
	}
	int m = (l + r) / 2;
	if (pos <= m)
		Update (2 * nod, l, m);
	else
		Update (2 * nod + 1, m + 1, r);
	arb[nod] = Maxim (arb[2 * nod], arb[2 * nod + 1]);
}

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

int main ()
{
	fin >> N >> M;
	for (int i = 1, x; i <= N; ++i)
	{
		fin >> x;
		pos = i;
		val = x;
		Update (1, 1, N);
	}
	for (int i = 1, x, a, b; i <= M; ++i)
	{
		fin >> x >> a >> b;
		if (x == 0)
		{
			maxim = -1;
			start = a;
			finish = b;
			Query (1, 1, N);
			fout << maxim << "\n";
		}
		else
		{
			pos = a;
			val = b;
			Update (1, 1, N);
		}
	}
}