Cod sursa(job #2931808)

Utilizator namesurname01Name Surname namesurname01 Data 31 octombrie 2022 23:00:07
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb

#include <fstream>

using namespace std;

#define N 100000
int tree[2 * N + 2];
int posInVector, nodeValue;

void updateTree(int st, int dr, int node) {
	if (st == dr) {
		tree[node] = nodeValue;
	}
	else {

		int mid = (st + dr) / 2;
		if (posInVector <= mid) {
			updateTree(st, mid, 2 * node);
		}
		if (mid < posInVector) {
			updateTree(mid + 1, dr, 2 * node + 1);
		}
		tree[node] = max(tree[2 * node], tree[2 * node + 1]);
	}
}

int ma;
void detMaxim(int st, int dr, int a, int b, int node) {
	if (a <= st && dr <= b) {
		ma = max(ma, tree[node]);
	}
	else {
		int mid = (st + dr) / 2;
		if (a <= mid) {
			detMaxim(st, mid, a, b, 2 * node);
		}
		if (mid < b) {
			detMaxim(mid + 1, dr, a, b, 2 * node + 1);
		}
	}
}

int main() {

	ifstream f("arbint.in");
	ofstream g("arbint.out");
	int totalNodes, queries, a, b, type;
	f >> totalNodes >> queries;
	for (int i = 1; i <= totalNodes; ++i) {
		f >> nodeValue;
		posInVector = i;
		updateTree(1, totalNodes, 1);
	}

	for (int i = 1; i <= queries; ++i) {
		f >> type >> a >> b;
		if (type) {
			posInVector = a;
			nodeValue = b;
			updateTree(1, totalNodes, 1);
		}
		else {
			ma = INT32_MIN;
			detMaxim(1, totalNodes, a, b, 1);
			g << ma << "\n";
		}
	}
	return 0;
}