Cod sursa(job #448762)

Utilizator katakunaCazacu Alexandru katakuna Data 4 mai 2010 18:00:43
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.1 kb
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
#include <ctime>
using namespace std;

#define Lmax 300010
#define Pmax (1 << 25)
#define INF 1 << 30

struct treap {
	int key, priority, min, max, dif_min;
	treap *left, *right;
	treap (int key, int priority, int min, int max, int dif_min, treap *left, treap *right) {
		this->key = key;
		this->priority = priority;
		this->min = min;
		this->max = max;
		this->dif_min = dif_min;
		this->left = left;
		this->right = right;
	}
} *rad, *nil;

int nr, nr_nod, pr;

void rot_left (treap* &nod) {
	
	treap *fiu = nod->left;
	nod->left = fiu->right;  fiu->right = nod;
	nod = fiu;
}

void rot_right (treap* &nod) {
	
	treap* fiu = nod->right;
	nod->right = fiu->left; fiu->left = nod;
	nod = fiu;
}

void param (treap* &nod) {
	
	nod->min = min (nod->key, nod->left->min);
	nod->max = max (nod->key, nod->right->max);
	nod->dif_min = min ( min(nod->left->dif_min, nod->right->dif_min), min ( abs (nod->key - nod->left->max), abs (nod->key - nod->right->min) ) );
}

void balance (treap* &nod) {
	
	if (nod->left->priority > nod->priority)
		rot_left (nod);
	
	if (nod->right->priority > nod->priority)
		rot_right (nod);
	
	param (nod);
}

void insert (treap* &nod, int key, int priority) {
	
	if (nod == nil) {
		nod = new treap (key, priority, key, key, INF, nil, nil);
		nr_nod++;
		return ;
	}
	
	if (key == nod->key) return;
	
	if (key < nod->key)
		insert (nod->left, key, priority);
	else
		insert (nod->right, key, priority);
	
	balance (nod);
}

void erase (treap *&nod, int key) {
	
	if (nod == nil)
		return ;
	
	if (key < nod->key)
		erase (nod->left, key);
	else {
		if (key > nod->key) 
			erase (nod->right, key);
		else {
			if (nod->left == nil && nod->right == nil)
				delete nod, nod = nil;
			else {
				if (nod->left->priority > nod->right->priority)
					rot_left (nod);
				else
					rot_right (nod);
				
				erase (nod, key);
			}
		}
	}
	
	if (nod != nil) 
		param (nod);
}

int find (treap* &nod, int key) {
	
	if (nod == nil) 
		return 0;
	
	if (key == nod->key) return 1;
	
	if (key < nod->key)
		return find (nod->left, key);
	else
		return find (nod->right, key);
}

int main () {

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

	srand (time (0));
	rad = nil = new treap(0, 0, INF, -INF, INF, NULL, NULL);
	
	char s[1 << 5]; scanf ("%s", s);
	while (!feof (stdin)) {
		if (s[0] == 'I') {
			scanf ("%d", &nr);
			pr = rand () % Pmax + 1;
			insert (rad, nr, pr);
		}
		
		if (s[0] == 'C') {
			scanf ("%d", &nr);
			printf ("%d\n", find (rad, nr));
		}
		
		if (s[0] == 'S') {
			scanf ("%d", &nr);
			if (!find (rad, nr)) 
				printf ("-1\n");
			else 
				erase (rad, nr), nr_nod--;
		}
		
		if (s[0] == 'M' && s[1] == 'A') {
			if (nr_nod < 2) printf ("-1\n");
			else {
				printf ("%d\n", rad->max - rad->min);
			}
		}
		
		if (s[0] == 'M' && s[1] == 'I') {
			if (nr_nod < 2) printf ("-1\n");
			else {
				printf ("%d\n", rad->dif_min);
			}
		}
		scanf ("%s", s);
	}
	

	return 0;
}