Cod sursa(job #652507)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 24 decembrie 2011 19:45:51
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <cstdio>
#include <ctime>
#include <cstdlib>


#define file_in "zeap.in"
#define file_out "zeap.out"

#define inf 0x3f3f3f3f

struct nod{
	
	int val;
	int p;
	int min;
	int max;
	int dif;
	nod * st, *dr;
    nod(){};
	nod(int val, int p, int min, int max, int dif, nod * st, nod *dr){
		this->val=val;
		this->p=p;
		this->min=min;
		this->max=max;
		this->dif=dif;
		this->st=st;
		this->dr=dr;
	}
}
*R,*nil;

char s[1000];
int x,i;

inline int min(int a, int b) { return a<b?a:b; }

inline int max(int a, int b) { return a>b?a:b; }

inline int abs(int a) { return a>=0?a:-a; }

void act(nod *& c){
	
	c->min=min(c->min,c->st->min);
	c->max=max(c->max,c->dr->max);
	c->dif=min(min(c->st->dif,c->dr->dif),min(abs(c->st->min-c->val),abs(c->dr->max-c->val)));
}

void init(nod *& R){
	
	srand(time(0));
	R=nil=new nod(0,0,inf,-inf,inf,NULL,NULL);
}

void rotst(nod *& c){
	
	nod * v=c->st;
	c->st=v->dr;
	v->dr=c;
	c=v;
	if (c!=nil && c->dr!=nil)
		act(c->dr);
}

void rotdr(nod *& c){
	
	nod * v=c->dr;
	c->dr=v->st;
	v->st=c;
	c=v;
	if (c!=nil && c->st!=nil)
		act(c->st);
}

void balance(nod *& c){
	
	if (c->st->p>c->p)
		rotst(c);
	if (c->dr->p>c->p)
		rotdr(c);
	act(c);
}

void inserare(nod *& c, int x, int p){
	
	if (c==nil){
		c=new nod(x,p,x,x,inf,nil,nil);
		return;
	}
	
	if (c->val>x)
		inserare(c->st,x,p);
	else
		inserare(c->dr,x,p);
	
	balance(c);
}

int cautare(nod *& c, int x){
	
	if (c==nil)
		return 0;
	
	if (c->val==x)
		return 1;
	if (c->val>x)
		return cautare(c->st,x);
	else
		return cautare(c->dr,x);
}


void stergere(nod *& c, int x){
	
	if (c==nil)
		return ;
	
	if (c->val==x){
		
		if (c->st==nil && c->dr==nil){
			delete c;
			c=nil;
		}
		else
			if (c->st->p>c->dr->p)
				rotst(c);
			else
				rotdr(c);
			stergere(c,x);
			
		
	}
	else
	if (c->val>x)
		stergere(c->st,x);
	else
		stergere(c->dr,x);
	if (c!=nil)
		act(c);
}

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	init(R);
	
	while(fgets(s,1000,stdin)){
		
		if (s[0]=='I'){
			i=2;
			x=0;
			while(s[i]>='0' && s[i]<='9'){
				x=x*10+s[i]-'0';
				i++;
			}
			
			if (!cautare(R,x))
			inserare(R,x,rand()+1);
		}
		else
		if (s[0]=='S'){
			i=2;
			x=0;
			while(s[i]>='0' && s[i]<='9'){
				x=x*10+s[i]-'0';
				i++;
			}
			
			if (cautare(R,x))
				stergere(R,x);
			else
				printf("-1\n");
		}
		else
		if (s[0]=='C'){
			i=2;
			x=0;
			while(s[i]>='0' && s[i]<='9'){
				x=x*10+s[i]-'0';
				i++;
			}
			
			printf("%d\n", cautare(R,x));
		}	
		else
		if (s[0]=='M' && s[1]=='A'){
			if (R->st==nil && R->dr==nil)
				printf("-1\n");
			else
				printf("%d\n", R->max-R->min);
		}
		else{
			if (R->st==nil && R->dr==nil)
				printf("-1\n");
			else
				printf("%d\n", R->dif);
		}	
	}
	
	return 0;
	
}