Cod sursa(job #1898170)

Utilizator horiainfoTurcuman Horia horiainfo Data 1 martie 2017 20:58:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int n, m;
int graf[400000];

void update(int nod, int st, int dr, int val, int poz)
{
	if (st == dr)
	{
		graf[nod] = val;
		return;
	}
	
	int mij = (st + dr) / 2;

	if (poz <= mij)
		update(nod * 2, st, mij, val, poz);
	else
		update(nod * 2 + 1, mij + 1, dr, val, poz);

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

int querry(int nod, int st, int dr, int intSt, int intDr)
{
	if (intSt <= st && dr <= intDr)
		return graf[nod];
	
	int mij = (st + dr) / 2;

	int vmax = 0;
	if (intSt <= mij)
		vmax = querry(nod * 2, st, mij, intSt, intDr);
	if (intDr > mij)
		vmax = max(vmax, querry(nod * 2 + 1, mij + 1, dr, intSt, intDr));

	return vmax;
}

int main()
{
	int a, b, op, val, poz;

	fin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		fin >> val;
		update(1, 1, n, val, i);
	}

	for (int i = 1; i <= m; i++)
	{
		fin >> op >> a >> b;
		
		if (op)
			update(1, 1, n, b, a);
		else
			fout << querry(1, 1, n, a, b) << '\n';
	}
	return 0;
}