Cod sursa(job #2966114)

Utilizator MihneaStoicaMihnea Teodor Stoica MihneaStoica Data 16 ianuarie 2023 19:22:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;

#define dim 100001

int N, M;
int MaxArb[4 * dim + 66];
int start, finish, Val, Pos, maxim;

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

	return b;
}

void Update (int, int, int);
void Query (int, int, int);

int main()
{
	int X, A, B;
	ifstream in ("arbint.in");
	ofstream out ("arbint.out");
	in >> N >> M;

	for (int i = 1; i <= N; i++)
	{
		in >> X;
		Pos = i, Val = X;
		Update (1, 1, N);
	}

	for (int i = 1; i <= M; i++)
	{
		in >> X >> A >> B;

		if (X == 0)
		{
			maxim = -1;
			start = A, finish = B;
			Query (1, 1, N);
			out << maxim << '\n';
		}
		else
		{
			Pos = A, Val = B;
			Update (1, 1, N);
		}
	}
}

void Update (int nod, int left, int right)
{
	if (left == right)
	{
		MaxArb[nod] = Val;
		return;
	}

	int div = (left + right) / 2;

	if (Pos <= div)
	{
		Update (2 * nod, left, div);
	}
	else
	{
		Update (2 * nod + 1, div + 1, right);
	}

	MaxArb[nod] = Maxim (MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}

void Query (int nod, int left, int right)
{
	if (start <= left && right <= finish)
	{
		if (maxim < MaxArb[nod])
		{
			maxim = MaxArb[nod];
		}

		return;
	}

	int div = (left + right) / 2;

	if (start <= div)
	{
		Query (2 * nod, left, div);
	}

	if (div < finish)
	{
		Query (2 * nod + 1, div + 1, right);
	}
}