Cod sursa(job #2923123)

Utilizator Alin_StanciuStanciu Alin Alin_Stanciu Data 11 septembrie 2022 17:52:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#define MAX_N		 100000
#define MAX_N_CEILED 131072

#include <iostream>
#include <fstream>

using namespace std;

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

struct
{
	void set(int node, int left, int right, int index, int value)
	{
		if (left == right)
		{
			data[node] = value;
			return;
		}

		int mid = (left + right) / 2;

		if (index <= mid)
			set(node * 2, left, mid, index, value);
		else
			set(node * 2 + 1, mid + 1, right, index, value);

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

	int get(int node, int left, int right, int qleft, int qright)
	{
		if (qleft <= left && right <= qright)
			return data[node];

		int mid = (left + right) / 2, ma = 0;

		if (qleft <= mid)
			ma = max(ma, get(node * 2, left, mid, qleft, qright));
		if (qright >= mid + 1)
			ma = max(ma, get(node * 2 + 1, mid + 1, right, qleft, qright));

		return ma;
	}

	int data[2 * MAX_N_CEILED];
} it;

int main()
{
	int N, M;
	fin >> N >> M;

	for (int i = 1; i <= N; ++i)
	{
		int Ai;
		fin >> Ai;
		it.set(1, 1, N, i, Ai);
	}

	for (int i = 1; i <= M; ++i)
	{
		int op, a, b;
		fin >> op >> a >> b;

		if (op == 0)
			fout << it.get(1, 1, N, a, b) << '\n';
		else if (op == 1)
			it.set(1, 1, N, a, b);
	}

	return 0;
}