Cod sursa(job #2214341)

Utilizator AlexDabuDabu Alexandru AlexDabu Data 18 iunie 2018 19:59:02
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int N, M;
int A, B, X, maxim;
int ArbMax[400100];

void Update(int pos, int val, int nod, int left, int right)
{
	if (left == right)
	{
		ArbMax[nod] = val;
		return;
	}

	int mij = (left + right) / 2;

	if (pos <= mij) Update(pos, val, 2 * nod, left, mij);
	else			 Update(pos, val, 2 * nod + 1, mij + 1, right);

	(ArbMax[2 * nod] > ArbMax[2 * nod + 1]) ? (ArbMax[nod] = ArbMax[2 * nod]) : (ArbMax[nod] = ArbMax[2 * nod + 1]);
}

void GetMax(int start, int finish, int nod, int left, int right)
{
	if (start <= left && right <= finish)
	{
		if (maxim < ArbMax[nod]) maxim = ArbMax[nod];
		return;
	}

	int mij = (left + right) / 2;
	if (start <= mij) GetMax(start, finish, 2 * nod, left, mij);
	if (mij < finish) GetMax(start, finish, 2 * nod + 1, mij + 1, right);
}

int main()
{
	fin >> M >> N;
	for (int i = 1; i <= N; i++)
	{
		fin >> X;
		Update(i, X, 1, 1, N);
	}
	for (int i = 1; i <= M; i++)
	{
		fin >> X >> A >> B;
		if (X == 0)
		{
			maxim = -1;
			GetMax(A, B, 1, 1, N);
			fout << maxim << '\n';
		}
		else
		{
			Update(A, B, 1, 1, N);
		}
	}
}