Cod sursa(job #3325099)

Utilizator iccjocIoan CHELARU iccjoc Data 24 noiembrie 2025 19:12:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>
using namespace std;

class MaximumSegmentTree
{
	int tree_size = 0;
	vector<long long> tree;
public:
	explicit MaximumSegmentTree(int n)
	{
		this->tree.resize(4 * n + 20, 0);
		tree_size = n;
	}
	void update(int position, int value)
	{
		update_helper(1, 1, tree_size, position, value);
	}
	long long query(int position)
	{
		return query_helper(1, 1, tree_size, position, position);
	}
	long long query(int left, int right)
	{
		return query_helper(1, 1, tree_size, left, right);
	}
private:
	void update_helper(int node, int left, int right, int position, int value)
	{
		if(left == right)
		{
			tree[node] = value;
		}
		else
		{
			int middle = (left + right) / 2;
			if(position <= middle)
			{
				update_helper(node * 2, left, middle, position, value);
			}
			else
			{
				update_helper(node * 2 + 1, middle + 1, right, position, value);
			}
			tree[node] = max(tree[node * 2],tree[node * 2 + 1]);
		}
	}
	long long query_helper(int node, int left, int right, int query_left, int query_right)
	{
		if(query_left <= left && query_right >= right)
		{
			return tree[node];
		}
		else
		{
			int middle = (left + right) / 2;
			long long left_min = 0, right_min = 0;
			if(query_left <= middle)
			{
				left_min = query_helper(node * 2, left, middle, query_left, query_right);
			}
			if(middle + 1 <= query_right)
			{
				right_min = query_helper(node * 2 + 1, middle + 1, right, query_left, query_right);
			}
			return max(left_min, right_min);
		}
	}
};

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	cin.tie(nullptr)->sync_with_stdio(false);
	int n, q;
	cin >> n >> q;
	MaximumSegmentTree tree(n);
	for(int i = 1; i <= n; i++)
	{
		int x;
		cin >> x;
		tree.update(i, x);
	}
	for(int i = 1; i <= q; i++)
	{
		int t, x, y;
		cin >> t >> x >> y;
		if(t == 1)
		{
			tree.update(x, y);
		}
		if(t == 0)
		{
			cout << tree.query(x, y) << "\n";
		}
	}
}