Cod sursa(job #3280113)

Utilizator ridicheTudor Diaconu ridiche Data 25 februarie 2025 15:52:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>

using namespace std;

ifstream in;
ofstream out;

int n, m, a[100005], aint[400005];

void formareaint(int st, int dr, int pos)
{
	if (st == dr) aint[pos] = a[st];
	else
	{
		formareaint(st, (st+dr)/2, 2*pos);
		formareaint((st+dr)/2+1, dr, 2*pos+1);
		aint[pos] = max(aint[2*pos], aint[2*pos+1]);
	}
}

int suma(int st, int dr, int wst, int wdr, int pos)
{
	if (dr < wst) return 0;
	if (st > wdr) return 0;
	if (st < wst || dr > wdr)
	{
		return max(suma(st, (st + dr) / 2, wst, wdr, 2*pos), suma((st + dr) / 2 + 1, dr, wst, wdr, 2*pos+1));
	}
	else
	{
		return aint[pos];
	}
}

void setare(int st, int dr, int unde, int val, int pos)
{
	if (st == dr && st == unde)
	{
		aint[pos] = val;
	}
	else if (st <= unde && dr >= unde)
	{
		setare(st, (st + dr) / 2, unde, val, 2*pos);
		setare((st + dr) / 2 + 1, dr, unde, val, 2*pos+1);
		aint[pos] = max(aint[2*pos], aint[2*pos+1]);
	}
	else
	{
		return;
	}
}

int main()
{
	in.open("arbint.in");
	out.open("arbint.out");
	in >> n >> m;
	for (int i = 0; i < n; i++)
	{
		in >> a[i];
	}
	formareaint(0, n-1, 1);
	for (int i = 0; i < m; i++)
	{
		int c, x, y;
		in >> c >> x >> y;
		if (c == 0)
		{
			x--; y--;
			out << suma(0, n-1, x, y, 1) << "\n"s;
		}
		else
		{
			x--;
			setare(0, n-1, x, y, 1);
		}
	}
}