Cod sursa(job #1873453)

Utilizator Rocamadour1497Alexandru Martiniuc Rocamadour1497 Data 9 februarie 2017 02:01:58
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int a[100], aint[100005];

int maxim(int a, int b)
{
	if (a > b) return a;
	return b;
}
int n, m, x, y, t;
void build(int nod,int st ,int dr)
{
	if (st == dr)
	{
		f >> aint[st];
	}
	else
	{
		int m = st / 2 + dr / 2;
		build(2 * nod, st, m);
		build(2 * nod + 1, m + 1, dr);
		aint[nod] = maxim(aint[2 * nod], aint[2 * nod + 1]);
	}
}

void update(int nod, int st, int dr, int pos, int val)
{
	if (st == dr)
		aint[nod] = val;
	else
	{
		int m = st / 2 + dr / 2;
		if (pos <= m)
			update(2 * nod, st, m, pos, val);
		else
			update(2 * nod + 1, m + 1, dr, pos, val);
		aint[nod] = maxim(aint[2 * nod], aint[2 * nod + 1]);
	}
}

int querry(int nod, int st, int dr, int x, int y)
{
	if (st >= x && dr <= y) return aint[nod];
	else
	{
		int m = st / 2 + dr / 2;
		int maxx = 0;
		if (x <= m) maxx = maxim(maxx, querry(2 * nod, st, m, x, y));
		else maxx = maxim(maxx, querry(2 * nod+1,m+1,dr, x, y));
	}
}

int main()
{
	f>> n >> m;
	build(1, 1, m);
	int i;
	for (i = 1; i <= m; i++)
	{
		f >> t >> x >> y;
		if (t == 0)
			g<< querry(1, 1, n, x, y) << endl;
		else
			update(1, 1, n, x, y);

	}
}