Cod sursa(job #318078)

Utilizator FlorianFlorian Marcu Florian Data 26 mai 2009 20:08:52
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include<cstdio>
#include<time.h>
#include<algorithm>
using namespace std;
#define Inf 0x3f3f3f3f
#define Max 54254385
inline int MAX(int a, int b) { return a>b?a:b; }
inline int MIN(int a, int b) { return a<b?a:b; }
struct T
{
	T *l, *r;
	int key, pr, min, max, difmin;
	T() {}
	T(int key, int pr, int min, int max, int difmin, T* l, T* r)
	{
		this->l = l; this->r = r;
		this->key = key; this->pr = pr; this->min = min; this->max = max; 
		this->difmin=difmin;
	}
};
T *R,*nil;
inline int find(T* n, int val)
{
	if(n == nil) return 0;
	if(n->key == val) return 1;
	if(val < n->key) return find(n->l, val);
	return find(n->r, val);
}
inline void update(T* &n)
{
		n->min = MIN(n->key, n->l->min);
		n->max = MAX(n->key, n->r->max);
		n->difmin = MIN(MIN(n->l->difmin, n->r->difmin), MIN(n->key - n->l->max, n->r->min - n->key));
}
inline void rotleft(T* &n)
{
	T *t = n->l;
	n->l = t->r;
	t->r = n;
	n = t;
	//if(n!=nil && n->l != nil) 
	
}
inline void rotright(T* &n)
{
	T *t = n->r;
	n->r = t->l;
	t->l = n;
	n = t;
//	if(n!=nil && n->r != nil) update(n->r);	
}
void balance(T* &n)
{
	if(n->l->pr > n->pr) { rotleft(n); update(n->r); }
	else if(n->r->pr > n->pr){ rotright(n); update(n->l); }
	update(n);
}
void insert(T* &n, int key, int pr)
{
	if(n == nil)
	{
		n = new T(key,pr,key,key,Inf,nil,nil);
		update(n);
		return;
	}
	if(key < n->key) insert(n->l,key,pr);
	else if(key > n->key) insert(n->r,key,pr);
	balance(n);
}
void erase(T* &n, int key)
{
	if(n == nil) return;
	if(key < n->key) erase(n->l, key);
	else if(key > n->key) erase(n->r,key);
	else if(n->key == key)
	{
		if(n->r == nil && n->l == nil) 
		{
			delete n;
			n = nil;
			return;
		}
		if(n->l->pr > n->r->pr) rotleft(n);
		else rotright(n);
		erase(n,key);
		}
	update(n);
}
int main()
{
	char op[4];
	int x, cnt = 0;
	freopen("zeap.in","r",stdin);
	freopen("zeap.out","w",stdout);
	srand(time(0));
	R = nil = new T(0,0,Inf,-Inf,Inf,NULL,NULL);
	while(!feof(stdin))
	{
		scanf("%c",&op[0]);
		switch(op[0])
		{
		case 'I': 
			{
				scanf(" %d\n",&x);
				if(!find(R,x)) 
					{ ++cnt; insert(R,x, rand()%Max + 1); }
				break;
			}
		case 'S':
			{
				scanf(" %d\n",&x);
				if(!find(R,x)) printf("-1\n");
				else { cnt--; erase(R,x);}
				break;
			}
		case 'C':
			{
				scanf(" %d\n",&x);
				printf("%d\n",find(R,x));
				break;
			}
		case 'M':
			{
				scanf("%c%c\n",&op[1],&op[2]);
				if(cnt < 2) { printf("-1\n"); break; }
				if(op[1] == 'A')
				{
					printf("%d\n",R->max - R->min);
				}
				else printf("%d\n",R->difmin);
				break;
			}
		}
	}
	return 0;
}