Cod sursa(job #2657835)

Utilizator sebimihMihalache Sebastian sebimih Data 12 octombrie 2020 11:52:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

const int N = 100005;

int n, q;
int arb[4 * N];

void SetValue(int index, int val, int left = 1, int right = n, int node = 1)
{
	if (left == right)
	{
		arb[node] = val;
		return;
	}

	int mid = (left + right) / 2;
	if (index <= mid)
	{
		SetValue(index, val, left, mid, node * 2);
	}
	else
	{
		SetValue(index, val, mid + 1, right, node * 2 + 1);
	}

	arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
}

int query(int start, int finish, int left = 1, int right = n, int node = 1)
{
	if (start <= left && right <= finish)
	{
		return arb[node];
	}

	int mid = (left + right) / 2;
	int ans = 0;
	
	if (start <= mid)
	{
		ans = max(ans, query(start, finish, left, mid, node * 2));
	}
	if (mid < finish)
	{
		ans = max(ans, query(start, finish, mid + 1, right, node * 2 + 1));
	}

	return ans;
}

int main()
{
	fin >> n >> q;

	for (int i = 1; i <= n; i++)
	{
		int x;
		fin >> x;
		SetValue(i, x);
	}

	while (q--)
	{
		int op, a, b;
		fin >> op >> a >> b;
		if (op == 0)
		{
			fout << query(a, b) << '\n';
		}
		else
		{
			SetValue(a, b);
		}
	}
}