Cod sursa(job #1089802)

Utilizator NicuCJNicu B. NicuCJ Data 21 ianuarie 2014 22:32:17
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
using namespace std;

int arbint[400055], mx, i, n, m, a, b, c;

void query(int st, int dr, int s1, int s2, int act)
{

	if((s1<=st && st<=s2) && (s1<=dr && dr<=s2))
	{
		mx=max(mx, arbint[act]);
		return;
	}
	int	mij=(st+dr)/2;
	if((st<=s1 && s1<=mij) || (st<=s2 && s2<=mij))
	{
		query(st, mij, s1, s2, 2*act);
	}
	if((mij<s1 && s1<=dr) || (mij<s2 && s2<=dr))
	{
		query(mij+1, dr, s1, s2, 2*act+1);
	}
}
void update(int st, int dr, int poz, int val, int act)
{

	int mij=(st+dr)/2;
	if(st==poz && dr==poz)
	{
		arbint[act]=val;
		return;
	}
	if(st<=poz && poz<=mij)
		update(st, mij, poz, val, 2*act);
	if(mij<poz && poz<=dr)
		update(mij+1, dr, poz, val, 2*act+1);
	arbint[act]=max(arbint[2*act], arbint[2*act+1]);
}


int main()
{
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	f>>n>>m;
	for(i=1; i<=n; i++)
	{
		f>>a;
		update(1, n, i, a, 1);
	}
	for(i=1; i<=m; i++)
	{
		f>>a>>b>>c;
		if(a==0)
		{
			mx=-1;
			query(1, n, b, c, 1);
			g<<mx<<"\n";
		}
		if(a==1)
		{
			update(1, n, b, c, 1);
		}
	}
}