Cod sursa(job #1362960)

Utilizator starduststardust stardust Data 26 februarie 2015 17:11:50
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
#define maxn 10010
#define inf 1<<30

int aint[maxn];
int n, m;
int best = -inf;

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

void Update(int nod, int left, int right,int poz, int val)
{
	/*daca am ajuns la un interval format dintr-un singur element*/

	if (left == right)
	{
		aint[nod] = val;
		return;
	}

	int mid = (left + right) / 2;
	/*vad daca trebuie sa ma duc in fiul stang sau drept*/

	if (poz <= mid)
		Update(2 * nod,left, mid, poz, val);
	else
		Update(2 * nod + 1 ,mid + 1, right, poz, val);

	/*maximul din nodul curent este egal cu maximul dintre nodurile fiilor*/
	aint[nod] = maxim(aint[nod * 2], aint[nod * 2 + 1]);
}

void Query(int nod, int left, int right, int start, int finish)
{
	if (start <= left && right <= finish)
	{
		best = maxim(best, aint[nod]);
		return;
	}
	
	int mid = (left + right) / 2;
	if (start <= mid)
		Query(2 * nod, left, mid, start, finish);
	else
		Query(2 * nod + 1, mid + 1, right, start, finish);
}

int main()
{
	std::ifstream in("arbint.in");
	std::ofstream out("arbint.out");

	in >> n >> m;
	int x, y, z;
	for (int i = 1; i <= n; i++)
	{
		in >> x;
		Update(1, 1, n, i, x);
	}
	for (int i = 1; i <= m; i++)
	{
		in >> x >> y >> z;
		if (x == 0)
		{
			best = -inf;
			Query(1, 1, n, y, z);
			out << best << "\n";
		}
		if (x == 1)
		{
			Update(1, 1, n, y, z);
		}
	}
}