Cod sursa(job #2749512)

Utilizator LordNecrateBiowCuciureanu Dragos-Adrian LordNecrateBiow Data 6 mai 2021 21:59:16
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>
#include <math.h>
#include <vector>
#include <limits.h>

using namespace std;

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

int MaxArb[100005];
int start, finish, val, poz, maxim;

void modificare(int nod, int left, int right)
{
	if (left == right)
	{
		MaxArb[nod] = val;
		return;
	}

	int mij = (left + right) / 2;
	if (poz <= mij) 
		modificare(2 * nod, left, mij);
	else              
		modificare(2 * nod + 1, mij + 1, right);

	MaxArb[nod] = max(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}

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

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

int main()
{
	int op, a, b, x, n, m;
	fin >> n >> m;

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

	for (int i = 1; i <= m; i++)
	{
		fin >> op >> a >> b;
		if (op == 0)
		{
			maxim = -1;
			start = a;
			finish = b;
			determinare_max(1, 1, n);

			fout << maxim << "\n";
		}
		else
		{
			poz = a;
			val = b;
			modificare(1, 1, n);
		}
	}

	return 0;
}