Cod sursa(job #480169)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 26 august 2010 17:18:25
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 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];
int i,nr;

struct treap
{
	int x,priority,Min,Max,DMin;
	treap *St,*Dr;
	treap()
	{
	}
	treap(int x,int priority,int Min,int Max,int DMin,treap *St,treap *Dr)
	{
		this->x=x;
		this->priority=priority;
		this->Min=Min;
		this->Max=Max;
		this->DMin=DMin;
		this->St=St;
		this->Dr=Dr;
	}
};
treap *Rad,*nil;
void init()
{
	srand(time(NULL));
	Rad=nil=new treap(0,0,INF,-INF,INF,0,0);
}

void update(treap *&n)
{
	n->Min=min(n->x,n->St->Min);
	n->Max=max(n->x,n->Dr->Max);
	n->DMin=min(min(n->St->DMin,n->Dr->DMin),min(n->x-n->St->Max,n->Dr->Min-n->x));
}

void rotst(treap *&n)
{
	treap *t=n->St;
	n->St=t->Dr;	t->Dr=n;
	n=t;
	if(n->Dr!=nil)
		update(n->Dr);
}

void rotdr(treap *&n)
{
	treap *t=n->Dr;
	n->Dr=t->St;	t->St=n;
	n=t;
	if(n->St!=nil)
		update(n->St);
}

void balance(treap *&n)
{
	if(n->St->priority>n->priority)
		rotst(n);
	else
		if(n->Dr->priority>n->priority)
			rotdr(n);
	update(n);
}

void Insert(treap *&n,int x)
{
	if(n==nil)
	{
			n=new treap(x,rand()+1,x,x,INF,nil,nil);
			return ;
	}
	if(x<n->x)
		Insert(n->St,x);
	else
		if(n->x<x)
			Insert(n->Dr,x);
	balance(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 ;
			}
			if(n->St->priority>n->Dr->priority)
			{
				rotst(n);
				Delete(n->Dr,x);
			}
			else
			{
				rotdr(n);
				Delete(n->St,x);
			}
		}

	balance(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))
	{
		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==D)
				Delete(Rad,nr);
			else
				if(OP==S)
					printf("%d\n",Search(Rad,nr));
				else
				{
					if(Rad==nil||Rad->St==nil&&Rad->Dr==nil)
						printf("-1\n");
					else
					{
						if(OP==MIN)
							printf("%d\n",Rad->DMin);
						else
							printf("%d\n",Rad->Max-Rad->Min);
					}
				}
	}

	return 0;
}