Cod sursa(job #2680456)

Utilizator etohirseCristi Cretu etohirse Data 3 decembrie 2020 16:28:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <algorithm>

using namespace std;
int n, m;
int v[100001];
int ai[500001];
ifstream cin("arbint.in");
ofstream cout("arbint.out");

void build(int nod,int a,int b)
{
	if (a == b)
		ai[nod] = v[a];
	else
	{
		int mij = (a + b) / 2;
		build(2 * nod, a, mij);
		build(2 * nod + 1, mij + 1, b);
		ai[nod] = max(ai[2 * nod], ai[2 * nod + 1]);
	}
}

void update(int nod, int val, int pos, int x, int y)
{
	if (x == y)
		ai[nod] = val;
	else
	{
		int mij = (x + y) / 2;
		if (pos > mij)
			update(2*nod+1, val, pos, mij + 1, y);
		else update(2*nod, val, pos, x, mij);
		ai[nod] = max(ai[2 * nod], ai[2 * nod + 1]);
	}
}

int query(int nod, int a, int b, int x, int y)
{
	if (a <= x && y <= b)
		return ai[nod];
	else
	{
		int mij = (x + y) / 2;
		int nr1 = 0, nr2 = 0;
		if (a <= mij)
			nr1 = query(2 * nod, a, b, x, mij);
		if (b > mij)
			nr2 = query(2 * nod + 1, a, b, mij + 1, y);
		return max(nr1, nr2);
	}
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> v[i];
	build(1, 1, n);
	for (int i = 1; i <= m; i++)
	{
		int c, a, b;
		cin >> c >> a >> b;
		if (c == 1)
			update(1, b, a, 1, n);
		else
			cout << query(1, a, b, 1, n)<<"\n";
	}
	return 0;
}