Cod sursa(job #3218689)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 27 martie 2024 19:35:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <stdint.h>

int32_t max(int32_t x, int32_t y) {
	return (x > y) ? x : y;
}

const int32_t MAX_N = 100000;
const int32_t MAX_TREE = 1 << 18;

int32_t n, nLog2;
int32_t tree[MAX_TREE];

int32_t MaxInterval(int32_t a, int32_t b, int32_t ind = 1, int32_t start = 1, int32_t end = n) {
	if(start >= a && end <= b)
		return tree[ind];
	if(start > end || end < a || start > b)
		return 0;
	
	int32_t mij = (start + end) >> 1;
	int32_t val1 = 0, val2 = 0;
	if(a <= mij)
		val1 = MaxInterval(a, b, (ind << 1), start, mij);
	if(b >= mij)
		val2 = MaxInterval(a, b, (ind << 1) + 1, mij + 1, end);
	
	return max(val1, val2);
}
void Insert(int32_t target, int32_t val, int32_t ind = 1, int32_t start = 1, int32_t end = n) {
	if(start == end) {
		tree[ind] = val;
		return;
	}

	int32_t mij = (start + end) >> 1;
	if(target <= mij) {
		Insert(target, val, (ind << 1), start, mij);
	} else {
		Insert(target, val, (ind << 1) + 1, mij + 1, end);
	}

	tree[ind] = max(tree[(ind << 1)], tree[(ind << 1) + 1]);
}

int main() {
	std::ifstream fin("arbint.in");
	std::ofstream fout("arbint.out");

	int32_t m;
	fin >> n >> m;
	for(; (1 << nLog2) < n; ++nLog2);

	for(int32_t i = 1; i <= n; ++i) {
		int32_t val;
		fin >> val;
		Insert(i, val);
	}

	for(int32_t i = 0; i != m; ++i) {
		int32_t c, a, b;
		fin >> c >> a >> b;

		if(c == 0) {
			fout << MaxInterval(a, b) << '\n';
		} else {
			Insert(a, b);
		}
	}

	fin.close();
	fout.close();

	return 0;
}