Cod sursa(job #1234567)

Utilizator Kira96Denis Mita Kira96 Data 27 septembrie 2014 16:05:25
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include<fstream>
#include<cstdlib>
#define inf 1<<30
#define FOR(a,b,c) for(register int a=b;a<=c;++a)
#include<ctime>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
char s[10];
int x;
struct Tr
{
	Tr *l,*r;
	int key,pr,mi,ma,midi,madi,cnt;
	Tr() {};
	Tr(int _key,int _pr)
	{
		l=r=NULL;
		mi=ma=key=_key;
		midi=inf;
		madi=-inf;
		cnt=1;
		pr=_pr;
	}
};
#define T Tr*
T R;
int cnt(T t)
{
	if(!t)
		return 0;
	return t->cnt;
}
int mi(T t)
{
	if(!t)
		return inf;
	return t->mi;
}
int ma(T t)
{
	if(!t)
		return -inf;
	return t->ma;
}
int midi(T t)
{
	if(!t)
		return inf;
	return t->midi;
}
int madi(T t)
{
	if(!t)
		return -inf;
	return t->madi;
}
void upd(T &t)
{
	if(!t)
		return;
	t->cnt=cnt(t->l)+cnt(t->r)+1;
	t->mi=min(t->key,mi(t->l));
	t->ma=max(t->key,ma(t->r));
	t->madi=t->ma-t->mi;
	t->midi=min(min(midi(t->l),midi(t->r)),min(t->key-ma(t->l),mi(t->l)-t->key));
}
void split(T t,T &l,T &r,double key)
{
	if(!t)
		l=r=NULL;
	else
	if(key<t->key)
		split(t->l,l,t->l,key),r=t;
	else
		split(t->r,t->r,r,key),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-0.5), t=it;
	else
		insert(it->key-0.5 < t->key ? t->l : t->r, it);
	upd(t);
}
void erase(T &t,int &k)
{
	if(!t)
		k=-1;
	else
	if(t->key==k)
		merge(t,t->l,t->r);
	else
		erase(k < t->key ? t->l : t->r, k);
}
int find(T &t,int k)
{
	if(!t)
		return 0;
	if(t->key==k)
		return 1;
	return find(k < t->key ? t->l : t->r, k);
}
int main()
{
	while(f>>s)
	{
		if(s[0]=='M')
		{
			if(s[1]=='A')
			{
				if(cnt(R)>=2)
					g<<abs(R->madi)<<"\n";
				else
					g<<"-1\n";
			}
			else
			{
				if(cnt(R)>=2)
					g<<abs(R->midi)<<"\n";
				else
					g<<"-1\n";
			}
		}
		else
		if(s[0]=='I')
		{
			f>>x;
			T it=new Tr(x,rand()+1);
			insert(R,it);
		}
		else
		if(s[0]=='S')
		{
			f>>x;
			erase(R,x);
			if(x==-1)
				g<<"-1\n";
		}
		else
		{
			f>>x;
			g<<find(R,x)<<"\n";
		}
	}
	return 0;
}
//Look at me! Look at me! The monster inside me has grown this big!