Cod sursa(job #1250511)

Utilizator BabutaRaresBabuta Rares Mihai BabutaRares Data 28 octombrie 2014 11:30:06
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
using namespace std;

int maxim(int a, int b);
void update(int nod,int left, int right, int pos, int val);
void querry(int nod,int left, int right, int start, int finish, int &max);

int maxArb[400071];
int main()
{
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	int n, m, i, j,a,b,op,max;
	f >> n >> m;
	for (i = 1; i <= n; i++)
	{
		f >> a;
		update(1, 1,n, i, a);
	}
	for (i = 1; i <= m; i++)
	{
		f >> op >> a >> b;
		if (op == 0)
		{
			max = -1;
			querry(1, 1, n, a, b, max);
			g << max << "\n";
		}
		else
			update(1, 1, n, a, b);
	}
}
int maxim(int a, int b)
{
	if (a > b) return a;
	return b;
}
void update(int nod, int left, int right, int pos, int val)
{
	if (left == right)
	{
		maxArb[nod] = val;
		return;
	}		
	int div = (left + right) / 2;
	if (pos <= div) update(2 * nod, left, div, pos, val);
	else
		update(nod * 2 + 1, div + 1, right, pos, val);
	maxArb[nod] = maxim(maxArb[nod * 2], maxArb[nod * 2 + 1]);
}
void querry(int nod, int left, int right, int start, int finish,int &max)
{
	if (left >= start && right <= finish)
	{
		if (max < maxArb[nod]) max = maxArb[nod];
		return;
	}
		
		int div;
		div = (left + right) / 2;
	if (start <= div) querry(2 * nod, left, div, start, finish, max);
	if (finish > div) querry(2 * nod + 1, div + 1, right, start, finish, max);
}