Cod sursa(job #1236507)

Utilizator Kira96Denis Mita Kira96 Data 2 octombrie 2014 00:26:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<fstream>
#include<algorithm>
#define N 100100
#define FOR(a,b,c) for(register int a=b;a<=c;++a)
#define ROF(a,b,c) for(register int a=b;a>=c;--a)
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,a,b,tip,m,x;
struct Tr
{
	Tr *l,*r;
	int key,val,ma,pr;
	Tr(){}
	Tr(int _key,int _pr,int _val)
	{
		key=_key;
		pr=_pr;
		ma=val=_val;
		l=r=NULL;
	}
};
#define T Tr*
T R;
int ma(T t)
{
	if(!t)
		return 0;
	return t->ma;
}
void upd(T &t)
{
	if(!t)
		return;
	t->ma=max(t->val,max(ma(t->l),ma(t->r)));
}
void split(T t,T &l,T &r,int k)
{
	if(!t)
		l=r=NULL;
	else
	if(k<=t->key)
		split(t->l,l,t->l,k),r=t;
	else
		split(t->r,t->r,r,k),l=t;
	upd(t);
}
void merge(T &t,T l,T r)
{
	if(!l||!r)
		t=l?l:r;
	else
	if(l->pr > r->pr)
		merge(l->r,l->r,r),t=l;
	else
		merge(r->l,l,r->l),t=r;
	upd(t);
}
void insert(T &t,T it)
{
	if(!t)
		t=it;
	else
	if(it->pr > t->pr)
		split(t,it->l,it->r,it->key),t=it;
	else
		insert(it->key > t->key ? t->r : t-> l,it);
	upd(t);
}
void erase(T &t,int k)
{
	if(t->key==k)
		merge(t,t->l,t->r);
	else
		erase(k > t->key ? t->r : t->l,k);
	upd(t);
}
void query(int l,int r)
{
	Tr *t1,*t2,*t3;
	split(R,t1,t2,l);
	split(t2,t2,t3,r+1);
	g<<t2->ma<<"\n";
	merge(R,t1,t2);
	merge(R,R,t3);
}
int main ()
{
	f>>n>>m;
	FOR(i,1,n)
	{
		f>>x;
		T t=new Tr(i,rand()+1,x);
		insert(R,t);
	}
	FOR(i,1,m)
	{
		f>>tip;
		if(!tip)
		{
			f>>a>>b;
			query(a,b);
		}
		else
		{
			f>>a>>b;
			erase(R,a);
			T t=new Tr(a,rand()+1,b);
			insert(R,t);
		}
	}
	return 0;
}
//Look at me!Look at me!The monster inside me has grown this big!