Cod sursa(job #1204285)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 2 iulie 2014 16:09:52
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("zeap.in");
ofstream o("zeap.out");
struct nod{
	nod *st,*dr;
	int v,h,def,mx,mn;
	nod(){
		st=dr=NULL;
		def=h=0;
		v=-1;
		mx=-1;
		mn=-1;
	}
};
nod *head;
int nr=0,ok,k=0,a[300200],def;

nod *hight(nod *p){
	if(p->dr!=0 && p->st!=0){
		p->def = p->dr->h-p->st->h;//>0 - mai multi in dreapta , <0 mai multi in stinga
		p->h = max(p->dr->h,p->st->h)+1;
		p->mn = min(p->v,min(p->st->mn,p->dr->mn));
		p->mx = max(p->v,max(p->st->mx,p->dr->mx));
	}else if(p->dr!=0 || p->st!=0){
		if(p->st==0){
		p->def = p->dr->h;
		p->h = p->dr->h+1;	
		p->mn = min(p->v,p->dr->mn);
		p->mx = max(p->v,p->dr->mx);
		}else{
		p->def = -p->st->h;
		p->h = p->st->h+1;	
		p->mn = min(p->v,p->st->mn);
		p->mx = max(p->v,p->st->mx);
		}		
	}else{
		p->def=p->h=0;
		p->mn=p->mx=p->v;
	}
	return p;
}

nod *right(nod *p){
	nod *x = new nod;
	x = p->st;
	p->st=x->dr;
	x->dr = p;
	p=hight(p);
	x=hight(x);
	return x;
}
nod *left(nod *p){
	nod *x = new nod;
	x = p->dr;
	p->dr=x->st;
	x->st = p;
	p=hight(p);
	x=hight(x);
	return x;
}

nod *echilibru(nod *p){
	 p = hight(p);
	 if(p->def==2){
	 	if( p->dr->def==-1)p->dr = right(p->dr);
	 	p = left(p);
	 }
	 if(p->def==-2){
	 	if(p->st->def==1)p->st =  left(p->st); 
	 	p = right(p);
	 }
	 
	 return p;
}

nod *adauga(int x,nod *v){
	if(v==NULL){
		nod *t = new  nod;
		t->v=t->mn=t->mx=x;		
		return t;
	}
   if(v->v==x){
   	ok=1;
   	return v;
   }
	if(v->v>x){
	  v->st = adauga(x,v->st);	
	}
	else{
	  v->dr = adauga(x,v->dr);
	}
	v = echilibru(v);
	return v;
}
void srd(nod *x,int nr){
	if(x->st!=NULL)srd(x->st,nr+1);
//	o<<x->v<<" h-"<<x->h<<" def-"<<x->def<<" jos-"<<nr<<"\n";
    a[++k]=x->v;
    if(k>1)def=min(def,a[k]-a[k-1]);
	if(x->dr!=NULL)srd(x->dr,nr+1);
}

nod *sterge(int x,nod *p){
	if(p==0){ok=1; return 0;}
	if(x==p->v){
		if(p->st==0 && p->dr==0)return 0;
		else if(p->st==0 || p->dr==0){
			if(p->st==0)return p->dr;
			else return p->st;
		}else{
			nod *v = new nod;
			for(v=p->st;v->dr!=0;v=v->dr);
			p->v=v->v;
			p->st = sterge(p->v,p->st);		
			p = echilibru(p);
			return p;
		}
	}else 
	if(p->v>x) p->st = sterge(x,p->st);
	else p->dr = sterge(x,p->dr);
	p = echilibru(p);
	return p;
}

int cauta(int x,nod *p){
	if(p==0)return 0;
	if(p->v==x)return 1;
	if(p->v>x)return cauta(x,p->st);
	return cauta(x,p->dr);
}

int main(){
	int n,x;
//	f>>n;
	head = NULL;
	char c,c1,c2;
	while(f>>c){
		if(c=='I'){
		f>>x;ok=0;
		head = adauga(x,head);	
		if(ok==0)nr++;
		}else if(c=='S'){
		f>>x;ok=0;	
		head = sterge(x,head);
		if(ok==0)nr--;else o<<-1<<"\n";
		}else if(c=='C'){
			f>>x;
			o<<cauta(x,head)<<"\n";
		}else{
			f>>c1>>c2;
			if(c2=='X'){
				if(nr>1)o<<head->mx-head->mn<<"\n";else o<<"-1\n";
			}else{
				k=0;
				if(nr>1){
				k=0;
				def = 1000000000;
				srd(head,0);	
				o<<def<<"\n";
				}else o<<"-1\n";
			}
		}
		
	
	}
	
	

}