Cod sursa(job #1755070)

Utilizator howsiweiHow Si Wei howsiwei Data 9 septembrie 2016 12:58:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <vector>
using namespace std;

struct ST {
	int n;
	vector<int> t;
	ST(const vector<int>& a) {
		n = a.size();
		t.resize(n*2);
		for (int i = 0; i < n; i++) {
			t[n+i] = a[i];
		}
		for (int i = n-1; i >= 1; i--) {
			t[i] = max(t[i*2], t[i*2+1]);
		}
	}
};

void update(int i, int v, ST& st) {
	i += st.n;
	while (st.t[i] != v && i >= 1) {
		st.t[i] = v;
		v = max(st.t[i], st.t[i^1]);
		i /= 2;
	}
}

int getMax(int l, int u, const ST& st) {
	l += st.n;
	u += st.n;
	int ret = 0;
	while (l < u) {
		if (l & 1) ret = max(ret, st.t[l++]);
		if (u & 1) ret = max(st.t[--u], ret);
		l /= 2;
		u /= 2;
	}
	return ret;
}

int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	ios::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	ST st(a);
	for (int i = 0; i < m; i++) {
		int op;
		cin >> op;
		if (op == 0) {
			int l, u;
			cin >> l >> u;
			l--;
			printf("%d\n", getMax(l, u, st));
		}
		else {
			int i, v;
			cin >> i >> v;
			i--;
			update(i, v, st);
		}
	}
	return 0;
}