Cod sursa(job #1929066)

Utilizator valiro21Valentin Rosca valiro21 Data 17 martie 2017 00:30:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <algorithm>
#include <fstream>

template <typename T>
class SegmentTree {
	T *v;
	int n;

	T (*func)(T& val1, T& val2);
public:
	SegmentTree(int n, T (*func)(T &val1, T &val2)) {
		int pw;
		for (pw = 1; pw <= n; pw <<= 1);

		this->n = pw;
		v = new T[2 * pw];
		this->func = func;
		for (int i = 0; i < 2 * pw; i++) {
			v[i] = 0;
		}
	}

	void update(int pos, T val) {
		pos += n;
		for (v[pos] = val; pos; pos >>= 1) {
			v[pos >> 1] = func(v[pos], v[pos ^ 1]);
		}
	}

	int query(int left, int right) {
		T res = 0;
		for (left += n, right += n; left < right; left >>= 1, right >>= 1) {
			if (left & 1) {
				res = func(res, v[left]);
				left++;
			}

			if (right & 1) {
				right--;
				res = func(res, v[right]);
			}
		}
		return res;
	}
};

int main() {
	std::ifstream cin("arbint.in");
	std::ofstream cout("arbint.out");
	int n, m, x, t, a, b;
	cin >> n >> m;

	SegmentTree<int> arbint(n+1, [](int &v1, int &v2) {return std::max(v1, v2); });
	for (int i = 1; i <= n; i++) {
		cin >> x;
		arbint.update(i, x);
	}

	for (int i = 0; i < m; i++) {
		cin >> t >> a >> b;
		if (t == 1) {
			arbint.update(a, b);
		}
		else {
			cout << arbint.query(a, b + 1) << '\n';
		}
	}

	return 0;
}