Cod sursa(job #2902065)

Utilizator matthriscuMatt . matthriscu Data 15 mai 2022 14:11:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100005
#define problem "arbint"

int n, seg_tree[4 * NMAX];

void update(int pos, int val, int current = 1, int current_left = 1, int current_right = n) {
	if (current_left == current_right)
		seg_tree[current] = val;
	else {
		int mid = current_left + (current_right - current_left) / 2;
		if (pos <= mid)
			update(pos, val, 2 * current, current_left, mid);
		else
			update(pos, val, 2 * current + 1, mid + 1, current_right);

		seg_tree[current] = max(seg_tree[2 * current], seg_tree[2 * current + 1]);
	}
}

int query(int left, int right, int current = 1, int current_left = 1, int current_right = n) {
	if (left <= current_left && current_right <= right)
		return seg_tree[current];

	int mid = current_left + (current_right - current_left) / 2,
		left_ans = INT_MIN, right_ans = INT_MIN;

	if (left <= mid)
		left_ans = query(left, right, current * 2, current_left, mid);
	if (right >= mid + 1)
		right_ans = query(left, right, current * 2 + 1, mid + 1, current_right);

	return max(left_ans, right_ans);
}

int main()
{
	freopen(problem ".in", "r", stdin);
	freopen(problem ".out", "w", stdout);

	int m;
	scanf("%d%d", &n, &m);

	for (int i = 1, x; i <= n; ++i) {
		scanf("%d", &x);
		update(i, x);
	}

	for (int i = 1, c, a, b; i <= m; ++i) {
		scanf("%d%d%d", &c, &a, &b);
		if (c == 0)
			printf("%d\n", query(a, b));
		else
			update(a, b);
	}
}