Cod sursa(job #1081514)

Utilizator vladrochianVlad Rochian vladrochian Data 13 ianuarie 2014 18:16:45
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#define mx(a,b) a>b?a:b
#define B(x) x&1?x-1:x+1
using namespace std;
int n,m,ai[262144],p2=1,lim;
int Build(int nod)
{
	int l=nod<<1,r=l+1;
	if(r<lim)
		ai[nod]=mx(Build(l),Build(r));
	else if(l<lim)
		ai[nod]=Build(l);
	return ai[nod];
}
int Max(int a,int b)
{
	int nod=1,x=1,y=p2,m;
	while((x<a)||(y>b))
	{
		m=(x+y)>>1;
		if(m<a)
		{
			(nod<<=1)++;
			x=m+1;
		}
		else
		{
			nod<<=1;
			y=m;
		}
	}
	if(y==b)
		return ai[nod];
	else
		return mx(ai[nod],Max(y+1,b));
}
void Update(int a)
{
	int l=a<<1,r=l+1,v=ai[a],b=ai[B(a)];
	ai[a]=mx(ai[l],ai[r]);
	if(a>1&&(ai[a]>b||v>b))
		Update(a>>1);
}
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int main()
{
	int o,i,j,v,b;
	fin>>n>>m;
	while(p2<n)
		p2<<=1;
	lim=p2+n;
	for(i=p2;i<lim;i++)
		fin>>ai[i];
	Build(1);
	while(m--)
	{
		fin>>o>>i>>j;
		if(o)
		{
			i+=p2-1;
			v=ai[i];
			b=ai[B(i)];
			ai[i]=j;
			if(i>1&&(ai[i]>b||v>b))
				Update(i>>1);
		}
		else
			fout<<Max(i,j)<<"\n";
	}
	return 0;
}