Cod sursa(job #2443412)

Utilizator ArkinyStoica Alex Arkiny Data 27 iulie 2019 20:13:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;

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

int arb[100000 * 5 + 30];

void update(int el, int x, int y, int val, int k)
{
	int mid = (x + y) / 2;

	if (x == y && el == y)
	{
		arb[k] = val;
		return;
	}
	else if (el <= mid)
		update(el, x, mid, val, k * 2);
	else
		update(el, mid + 1, y, val, k * 2 + 1);

	arb[k] = max(arb[k * 2], arb[k * 2 + 1]);
}

int query(int a, int b, int x, int y, int k)
{
	int mid = (x + y) / 2, e1 = -1, e2 = -1;

	if (x == a && b == y)
		return arb[k];

	if (a <= mid)
		e1 = query(a, min(b, mid), x, mid, k * 2);

	if (b > mid)
		e2 = query(max(mid + 1, a), b, mid + 1, y, k * 2 + 1);

	return max(e1, e2);
}

int main()
{
	int N, Q;
	in >> N >> Q;

	for (int i = 1; i <= N; ++i)
	{
		int e;
		in >> e;
		update(i, 1, N, e, 1);
	}
	for (int i = 1; i <= Q; ++i)
	{
		int op, a, b;
		in >> op >> a >> b;
		if (!op)
			out << query(a, b, 1, N, 1) << '\n';
		else
			update(a, 1, N, b, 1);
	}

	return 0;
}