Cod sursa(job #480140)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 26 august 2010 15:26:18
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include<algorithm>
#include<string>
#include<time.h>
using namespace std;
#define INF 1<<30
string I="I";
string S="C";
string D="S";
string MAX="MAX";
string MIN="MIN";
string Op;
char c[30];

struct treap
{
	int Min,Max,x,priority,DMin;
	treap *St,*Dr;
	treap()
	{
		Min=INF;	Max=-INF;	DMin=INF;
		x=0;	priority=0;
		St=0;	Dr=0;
	}
	treap(int x,int priority,treap *St,treap *Dr)
	{
		this->x=x;
		this->priority=priority;
		this->St=St;
		this->Dr=Dr;
		this->Min=this->Max=x;
	}

};
treap *Rad,*nil;
void init()
{
	srand(time(NULL));
	Rad=new treap;
	nil=Rad;
}
void rotleft(treap *&n)
{
	treap *t=n->St;
	n->St=t->Dr;	t->Dr=n;
	n=t;
}

void rotright(treap *&n)
{
	treap *t=n->Dr;
	n->Dr=t->St;	t->St=n;
	n=t;
}

void balance(treap *&n)
{
	if(n->St->priority>n->priority)
		rotleft(n);
	else
		if(n->Dr->priority>n->priority)
			rotright(n);
}

void update(treap *&n)
{
	n->Max=max(n->Max,n->Dr->Max);
	n->Min=min(n->Min,n->St->Min);
	n->DMin=min(min(n->St->DMin,n->Dr->DMin),min(n->x-n->St->Max,n->Dr->Min-n->x));
}
void Insert(treap *&n,int x)
{
	if(n->x==x)
		return ;
	if(n==nil)
	{
		n=new treap(x,rand()+1,nil,nil);
		return ;
	}
	if(x<n->x)
		Insert(n->St,x);
	else
		Insert(n->Dr,x);
	balance(n);
	update(n);
}

void Delete(treap *&n,int x)
{
	if(n==nil)
	{
		printf("-1\n");
		return ;
	}
	if(x<n->x)
		Delete(n->St,x);
	else
		if(n->x<x)
			Delete(n->Dr,x);
		else
		{
			if(n->St==nil&&n->Dr==nil)
			{
				delete n;	n=nil;
				return ;
			}
			else
			{
				if(n->St->priority>n->Dr->priority)
					rotleft(n);
				else
					rotright(n);
				Delete(n,x);
			}
		}
		balance(n);
		update(n);
}
int Search(treap *&n,int x)
{
	if(n==nil)
		return 0;
	if(x<n->x)
		return Search(n->St,x);
	else
		if(n->x<x)
			return Search(n->Dr,x);
		else
		{
			return 1;
		}
}

int main()
{
	freopen("zeap.in","r",stdin);
	freopen("zeap.out","w",stdout);

	init();
	while(fgets(c,30,stdin))
	{
		int nr,i;
		i=nr=0;
		Op.clear();
		while('A'<=c[i]&&c[i]<='Z')
		{
			Op.push_back(c[i]);
			i++;
		}
		while(!('0'<=c[i]&&c[i]<='9'))
			i++;
		while('0'<=c[i]&&c[i]<='9')
		{
			nr=nr*10+c[i]-'0';
			i++;
		}
		if(Op==I)
			Insert(Rad,nr);
		else
		if(Op==S)
			printf("%d\n",Search(Rad,nr));
		else
		if(Op==D)
			Delete(Rad,nr);
		else
			if(Rad!=nil&&(Rad->St!=nil||Rad->Dr!=nil))
			{
				if(Op==MAX)
					printf("%d\n",Rad->Max-Rad->Min);
				if(Op==MIN)
					printf("%d\n",Rad->DMin);
			}
			else
				printf("-1\n");
	}
	return 0;
}