Cod sursa(job #2202232)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 8 mai 2018 00:43:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#define MAX 400005
using namespace std;

int n, m, t, x, y;
int arb[MAX];

int query(int pos, int l, int r, int s, int d) {
	int m = (l + r) / 2;
	int val1 = 0, val2 = 0;

	if (s <= l && r <= d)
		return arb[pos];
	if (d < l || r < s)
		return 0;

	if (s <= m)
		val1 = query(2 * pos, l, m, s, d);
	if (m < d)
		val2 = query(2 * pos + 1, m + 1, r, s, d);

	return max(val1, val2);
}

void update(int pos, int l, int r, int a, int b) {
	int m = (l + r) / 2;

	if (l == r) {
		arb[pos] = b;
		return;
	}

	if (a <= m)
		update(2 * pos, l, m, a, b);
	else
		update(2 * pos + 1, m + 1, r, a, b);

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

int main() {
	ifstream f("arbint.in");
	ofstream g("arbint.out");

	f >> n >> m;
	for (int i = 1; i <= n; ++i) {
		f >> x;
		update(1, 1, n, i, x);
	}

	for(int i = 0; i < m; ++i) {
		f >> t >> x >> y;
		if (t == 0)
			g << query(1, 1, n, x, y) << "\n";
		else
			update(1, 1, n, x, y);
	}

	return 0;
}