Cod sursa(job #1089837)

Utilizator NicuCJNicu B. NicuCJ Data 21 ianuarie 2014 23:13:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
using namespace std;

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

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

	if(s1<=st && dr<=s2)
	{
		if(mx<arbint[act])
			mx=arbint[act];
		return;
	}
	int	mij=(st+dr)/2;
	if(s1<=mij)
	{
		query(st, mij, s1, s2, 2*act);
	}
	if(mij<s2)
	{
		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==dr)
	{
		arbint[act]=val;
		return;
	}
	if(poz<=mij)
		update(st, mij, poz, val, 2*act);
	if(mij<poz)
		update(mij+1, dr, poz, val, 2*act+1);
	arbint[act]=arbint[2*act]>arbint[2*act+1]?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);
		}
	}
}