Cod sursa(job #2035481)

Utilizator robuvedVictor Robu robuved Data 9 octombrie 2017 15:06:55
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <algorithm>
#include <climits>
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

#define MAX 100000
int v[MAX], tree[4 * MAX];
int N, M;

class SegTree
{
public:
	static void Update(int poz, int val, int node = 0, int left = 0, int right = N - 1)
	{
		if (left == right)
		{
			tree[node] = v[poz] = val;
			return;
		}
		int mid = (left + right) / 2;
		int leftc = (node << 1) + 1;
		int rightc = leftc + 1;
		if (poz <= mid)
		{
			Update(poz, val, leftc, left, mid);
		}
		else
		{
			Update(poz, val, rightc, mid + 1, right);
		}
		tree[node] = max(tree[leftc], tree[rightc]);
	}
	static int Query(int x, int y, int node = 0, int left = 0, int right = N - 1)
	{
		if (left >= x && right <= y)
		{
			return tree[node];
		}
		int mid = (left + right) / 2;
		int max_ = -INT_MAX;
		if (mid >= x)
		{
			int leftc = (node << 1) + 1;
			max_ = Query(x, y, leftc, left, mid );
		}
		if (y > mid)
		{
			int rightc = (node << 1) + 2;
			max_ = max(max_, Query(x, y, rightc, mid + 1, right));
		}
		return max_;
	}
	static void BuildTree(int node = 0, int left = 0, int right = N - 1)
	{
		if (left == right)
		{
			tree[node] = v[left];
			return;
		}
		int mid = (left + right) / 2;
		int leftc = (node << 1) + 1;
		int rightc = leftc + 1;

		BuildTree(leftc, left, mid);
		BuildTree(rightc, mid + 1, right);

		tree[node] = max(tree[leftc], tree[rightc]);
	}
};
int main()
{
	in >> N >> M;

	for (int i = 0; i < N; i++)
	{
		in >> v[i];
	}
	SegTree::BuildTree(0, 0, N-1);
	for (int i = 0; i < M; i++)
	{
		int opt, a, b;
		in >> opt >> a >> b;
		if (opt == 0)
		{
			out << SegTree::Query(a - 1, b - 1) << endl;
		}
		else if (opt == 1)
		{
			SegTree::Update(a - 1, b);
		}
	}
}