Cod sursa(job #2909937)

Utilizator uwuenvyJeff Joe uwuenvy Data 17 iunie 2022 04:29:43
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace std;

// maximum segment tree
class SegmentTree {
public:
	SegmentTree(int n) : n(n) {
		tree.resize(4 * n);
	}

	void update(int i, int val) {
		update(i, val, 0, 0, n - 1);
	}

	int query(int l, int r) {
		return query(l, r, 0, 0, n - 1);
	}

	int query(int l, int r, int i, int left, int right) {
		if (l > right || r < left) return 0;
		if (l <= left && right <= r) return tree[i];
		int mid = (left + right) / 2;
		return max(query(l, r, 2 * i + 1, left, mid) , query(l, r, 2 * i + 2, mid + 1, right));
	}

	void update(int i, int val, int idx, int left, int right) {
		if (left == right) {
			tree[idx] = val;
			return;
		}
		int mid = (left + right) / 2;
		if (i <= mid) update(i, val, 2 * idx + 1, left, mid);
		else update(i, val, 2 * idx + 2, mid + 1, right);
		tree[idx] = max(tree[2 * idx + 1] , tree[2 * idx + 2]);
	}

	int n;
	vector<int> tree;
};

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	ifstream cin("arbint.in");
	ofstream cout("arbint.out");
	int n, q;
	cin >> n >> q;
	SegmentTree st(n);
	for(int i = 0; i < n; i++){
		int x;
		cin >> x;
		st.update(i, x);
	}
	while (q--) {
		int t;
		cin >> t;
		if (t == 1) {
			int i, val;
			cin >> i >> val;
			st.update(i-1, val);
		} else {
			int l, r;
			cin >> l >> r;
			cout << st.query(l-1, r-1) << endl;
		}
	}
}