Cod sursa(job #2606502)

Utilizator michael_blazemihai mihai michael_blaze Data 27 aprilie 2020 21:37:37
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <cmath>

#define max(a, b) ((a > b) ? (a) : (b))
#define MAX 100005

using namespace std;

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

int arr[MAX], n, m;
int arbore[2 * MAX + 5];

int max_intervals(int left, int right, int son) {
	if (arbore[son])
		return arbore[son];

	if (left == right) {
		arbore[son] = arr[left];
		return arr[left];
	}
	int mid = (left + right) / 2;

	arbore[son] = max(max_intervals(left, mid, 2 * son), 
		max_intervals(mid + 1, right, 2 * son + 1));
}
void update(int left, int right, int a, int b, int son) {
	if (left == right) {
		arr[left] = arbore[son] = b;
		return;
	}
	int mid = left + (right - left) / 2;
	if (a >= mid + 1) 
		update(mid + 1, right, a, b, 2 * son + 1);
	else 
		update(left, mid, a, b, 2 * son);

	arbore[son] = max(arbore[2 * son], arbore[2 * son + 1]);
}

int getMax(int left, int right,int a, int b, int son) {
	if ((left == a and right == b) or (left == right))
		return arbore[son];

	int mid = left + (right - left) / 2;
	

	if ( (a >= left and a <= mid) and (b >= mid + 1 and b <= right))
		return max(getMax(left, mid ,a, b, 2 * son), getMax(mid + 1, right, a, b, 2 * son + 1));
	if ((a >= left and a <= mid) and (b >= left and b <= mid))
		return getMax(left, mid, a, b, 2 * son);
	if ((a >= mid + 1 and a <= right) and (b >= mid + 1 and b <= right))
		return getMax(mid + 1, right, a, b, 2 * son + 1);
}
int main() {
	fin >> n >> m;
	
	for (int i = 1;i <= n;i ++)
		fin >> arr[i];

	max_intervals(1, n, 1);

	int operation, a, b;
	for (int i = 1;i <= m;i ++) {
		fin >> operation >> a >> b;

		if (operation)
			update(1, n, a, b, 1);
		else
			fout << getMax(1, n, a, b, 1) << '\n';
	}

	return 0;
}