Cod sursa(job #2628212)

Utilizator dream3rDavid Pop dream3r Data 14 iunie 2020 23:58:25
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
//#include "pch.h"
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <climits>
#include <queue>
#define ll long long int
#define nr 100005
using namespace std;
ifstream f("arbint.in");
ofstream o("arbint.out");
int abi[nr * 4];
int pos, val;
int start, finish;
int n, m;
int ans;
int cer;

void update(int nod, int stanga, int dreapta)
{
	if (stanga == dreapta)
	{
		abi[nod] = val;
		return;
	}
	int mid = (stanga + dreapta) / 2;

	if (pos <= mid)
	{
		update(2 * nod, stanga, mid);
	}
	else
	{
		update(2 * nod + 1, mid + 1, dreapta);
	}

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

void querry(int nod, int stanga, int dreapta)
{
	if (start <= stanga && dreapta <= finish)
	{
		if (ans < abi[nod])
		{
			ans = abi[nod];
		}
		return;
	}

	int mid = (stanga + dreapta) / 2;

	if (start <= mid)
	{
		querry(nod * 2, stanga, mid);
	}
	if (mid < finish)
	{
		querry(nod * 2 + 1, mid + 1, dreapta);
	}

}


int main()
{
	f >> n >> m;
	for (size_t i = 1; i <= n; i++)
	{
		int a;
		f >> a;
		pos = i;
		val = a;
		update(1, 1, n);
	}

	for (size_t i = 1; i <= m; i++)
	{
		int val1, val2;
		f >> cer >> val1 >> val2;
		if (cer == 0)
		{
			ans = -1;
			start = val1;
			finish = val2;
			querry(1, 1, n);
			o << ans << "\n";
		}
		else
		{
			pos = val1;
			val = val2;
			update(1, 1, n);
		}
	}


}