Cod sursa(job #2749882)

Utilizator vali_27Bojici Valentin vali_27 Data 8 mai 2021 21:16:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

int arb[100000 * 4];

void update(int nod, int st, int dr, int poz, int val)
{
	if (st == dr)
	{
		arb[nod] = val;
	}
	else
	{
		int mid = st + (dr - st) / 2;
		if (poz <= mid)
			update(nod * 2 + 1, st, mid, poz, val);
		else
			update(nod * 2 + 2, mid + 1, dr, poz, val);

		arb[nod] = std::max(arb[nod * 2 + 1], arb[nod * 2 + 2]);
	}
}

void query(int nod, int st, int dr, int x, int y, int& rez)
{
	if (st >= x && dr <= y)
	{
		if (rez < arb[nod])rez = arb[nod];
	}
	else
	{
		int mid = st + (dr - st) / 2;
		if (x <= mid)
			query(nod * 2 + 1, st, mid, x, y, rez);
		if (mid < y)
			query(nod * 2 + 2, mid + 1, dr, x, y, rez);
	}
}

int main()
{
	std::ifstream f("arbint.in");
	std::ofstream g("arbint.out");

	int n, m, tip, x , y;
	f >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		f >> x;
		update(0, 0, n - 1, i, x);
	}

	for (int i = 0; i < m; ++i)
	{
		f >> tip >> x >> y;
		switch (tip)
		{
		case 0:
		{
			int rez = -1;
			query(0, 0, n - 1, x-1, y-1, rez);
			g << rez << '\n';
			break;
		}
		case 1: update(0, 0, n - 1, x-1, y); break;
		}
	}
}