Cod sursa(job #2606547)

Utilizator michael_blazemihai mihai michael_blaze Data 27 aprilie 2020 22:41:24
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <cmath>

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

using namespace std;

long long arr[MAX], n, m;
long long arbore[3 * MAX];

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 (a <= left and right <= b)
		return arbore[son];
	else {
		int mid = left + (right - left) / 2;
		int Max = -1;

		if (a <= mid)
			Max = max(Max, getMax(left, mid, a, b, 2 * son));
		if (b > mid)
			Max = max(Max, getMax(mid + 1, right, a, b, 2 * son + 1));

		return Max;
	}
}
int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	scanf("%d%d", &n, &m);
	
	for (int i = 1;i <= n;i ++)
		scanf("%d", &arr[i]);

	max_intervals(1, n, 1);

	int operation, a, b;
	for (int i = 1;i <= m;i ++) {
		scanf("%d%d%d", &operation, &a, &b);

		if (operation)
			update(1, n, a, b, 1);
		else
			printf("%d\n",getMax(1, n, a, b, 1));
	}

	return 0;
}