Cod sursa(job #2039895)

Utilizator JohnnyKiteFlorin Smeu JohnnyKite Data 15 octombrie 2017 00:52:06
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1 << 17;

int T[kMaxN * 2];

int n, m;

void build(int x)
{
	if (x >= n) return;
	build(2 * x);
	build(2 * x + 1);
	T[x] = max(T[2 * x], T[2 * x + 1]);
}

void update(int k, int x)
{
	k += n - 1;
	T[k] = x;
	k /= 2;
	while (k >= 1) {
		T[k] = max(T[2 * k], T[2 * k + 1]);
		k /= 2;
	}
}

int query(int a, int b)
{
	a += n - 1; b += n - 1;
	int ans = -numeric_limits<int>::max() / 2;
	while (a <= b) {
		if (a % 2 == 1) ans = max(ans, T[a++]);
		if (b % 2 == 0) ans = max(ans, T[b--]);
		a /= 2; b /= 2;
	}
	return ans;
}

int main()
{
	freopen("arbint.in", "rt", stdin);
	freopen("arbint.out", "wt", stdout);
	cin >> n >> m;
	int rn = 1;
	for (rn = 1; rn < n; rn *= 2) ;
	if (n == 1) rn = 1;
	for (int i = 0; i < n; ++i) cin >> T[i + rn];
	n = rn;
	build(1);
	while (m--) {
		int t, a, b;
		cin >> t >> a >> b;
		if (t == 0) {
			cout << query(a, b) << '\n';
		} else {
			update(a, b);
		}
	}
	return 0;
}