Cod sursa(job #1970369)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 19 aprilie 2017 11:53:45
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
using namespace std;
#define Nmax 200001

int v[Nmax], arb[2 * Nmax + 10], maxim;

void actualizare(int, int, int, int);
void query(int, int, int, int, int);

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	ios_base::sync_with_stdio(false);

	int m, n, tip, a, b;
	scanf("%d %d", &n, &m);
	for (a = 1; a <= n; ++a)
	{
		scanf("%d", &v[a]);
		actualizare(1, 1, n, a);
	}

	for (; m; --m)
	{
		scanf("%d %d %d", &tip, &a, &b);
		if (tip == 0)
		{
			maxim = 0;
			query(1, a, b, 1, n);
			printf("%d\n", maxim);
		}
		else
		{
			v[a] = b;
			actualizare(1, 1, n, a);
		}
	}
	return 0;
}

void actualizare(int nod, int st, int dr, int poz)
{
	if (arb[nod] < v[poz]) arb[nod] = v[poz];

	if (st == dr) return;
	int m = (st + dr) >> 1;

	if (poz <= m) actualizare(2 * nod, st, m, poz);
	else actualizare(2 * nod + 1, m + 1, dr, poz);
}

void query(int nod, int a, int b, int st, int dr)
{
	if (a <= st && dr <= b)
	{
		maxim = (maxim > arb[nod] ? maxim : arb[nod]);
		return;
	}

	int m = (st + dr) >> 1;

	if (a <= m) query(2 * nod, a, b, st, m);
	if (m < b) query(2 * nod + 1, a, b, m + 1, dr);
}