Cod sursa(job #1253301)

Utilizator CostinVFMI CostinVictorGabriel CostinV Data 1 noiembrie 2014 01:32:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

using namespace std;

int arb[500001];

void update (int i, int x, int a, int b, int index)
{
	int m = (a+b)/2;

	if (a!=b)
	{
		if (i<=m)
			update (i, x, a, m, index*2);
		else
			update (i, x, m+1, b, index*2+1);
	}
	else
	{
		arb[index] = x;
		return;
	}
	
	arb[index] = max(arb[index*2], arb[index*2+1]);
}

int query (int a, int b, int st, int dr, int index)
{
	int m = (st+dr)/2;
	int maxl, maxr;
	
	if (a<=st && b>=dr)
		return arb[index];
	if (a<=m)
		maxl = query (a, b, st, m, index*2);
	if (m<b)
		maxr = query (a, b, m+1, dr, index*2+1);

	return (max(maxl, maxr));
}

int main()
{
	int n, m, t, x, a, b;
	
	ifstream in("arbint.in");
	ofstream out("arbint.out");		
	
	in>>n>>m;
	
	for(int i=1; i<=n; i++)
	{
		in>>x;
		update(i, x, 1, n, 1);
	}

	while(m--)
	{
		in>>t;
		if (t==0)
		{
			in>>a>>b;
			out<<query(a, b, 1, n, 1)<<"\n";
		}
		else
		{
			in>>a>>b;
			update(a, b, 1, n, 1);
		}
	}

	return 0;
}