Cod sursa(job #2094143)

Utilizator belgun_adrianBelgun Dimitri Adrian belgun_adrian Data 25 decembrie 2017 10:41:22
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>

void update(std::vector<int>& A, int idx, int l, int r, int pos, int val) {
	if (l == r) {
		A[idx] = val;
		return;
	}
	int m = (l + r) / 2;
	if (pos <= m) {
		update(A, idx * 2, l, m, pos, val);
	} else {
		update(A, idx * 2 + 1, m + 1, r, pos, val);
	}
	A[idx] = std::max(A[idx * 2], A[idx * 2 + 1]);
}

int getmax(const std::vector<int>& A, int idx, int l, int r, int a, int b) {
	if (l > r || r < a || b < l)
		return -1;

	if (a <= l && r <= b) // [l..r] in [a..b]
		return A[idx];

	int m = (l + r) / 2;

	int maxl = getmax(A, idx * 2, l, m, a, b);
	int maxr = getmax(A, idx * 2 + 1, m + 1, r, a, b);

	return std::max(maxl, maxr);
}

int main() {
	int m, n, x;
	std::ifstream in("arbint.in");
	std::ofstream out("arbint.out");
	in >> n >> m;

	std::vector<int> A(4 * n);
	for (int i = 1; i <= n; i++) {
		in >> x;
		update(A, 1, 1, n, i, x);
	}

	for (int i = 0; i < m; i++) {
		int op, a, b;
		in >> op >> a >> b;
		if (op == 0) {
			out << getmax(A, 1, 1, n, a, b) << "\n";
		} else { 
			update(A, 1, 1, n, a, b);
		}
	}

	return 0;
}