Cod sursa(job #411949)

Utilizator mihaionlyMihai Jiplea mihaionly Data 5 martie 2010 11:38:22
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <cstdio>
using namespace std;
#define ll long long
#define abs(x) ((x>0)?(x):(-(x)))
FILE *g=fopen("zeap.out","w");
FILE *f=fopen("zeap.in","r");
char s[25],o[5];
int ne;
ll x[2],n,mn;
struct arbore
 {
 ll x;
 arbore *st,*dr;
 };
arbore *A;
void insert(arbore *&ar,ll x)
 {
 if(ar==NULL)
  {
  arbore *p=new arbore;
  p->st=p->dr=NULL;
  p->x=x;
  ar=p;
  ++ne;
  return;
  }
 if(x==ar->x)return;
 if(x>ar->x)
  insert(ar->dr,x);
 else
  insert(ar->st,x);
 }
void del(arbore *&ar,ll x)
 {
 if(ar==NULL)
  {
  fprintf(g,"-1\n");
  return;
  }
 if(ar->x==x)
  {
  arbore *aux=ar;
  if(!aux->st&&!aux->dr)
   {
   aux=NULL;
   ar=aux;
   --ne;
   delete aux;
   return;
   }
  if(aux->st!=NULL||aux->dr!=NULL)
   {
   if(!aux->st)
    {
    arbore *p=aux;
	aux=aux->dr;
	ar=aux;
	delete p;
	--ne;
	return;
    }
   if(!aux->dr)
    {
    arbore *p=aux;
	aux=aux->st;
	ar=aux;
	delete p;
	--ne;
	return;
    }
   }
  if(aux->st&&aux->dr)
   {
   arbore *p=new arbore;
   p->x=aux->st->x;
   p->st=aux->st;
   p->dr=aux->dr;
   aux=p;
   del(aux->st,aux->x);
   }
  }
 else if(ar->x>x)
  del(ar->st,x);
 else
  del(ar->dr,x);
 }
void search(arbore *ar,int x)
 {
 if(ar==NULL)
  {
  fprintf(g,"0\n");
  return;
  }
 if(ar->x==x)
  {
  fprintf(g,"1\n");
  return;
  }
 if(x<ar->x)
  search(ar->st,x);
 else
  search(ar->dr,x);
 }
ll dreapta(arbore *ar)
 {
 if(!ar->dr)
  return ar->x;
 return dreapta(ar->dr);
 }
ll stanga(arbore *ar)
 {
 if(!ar->st)
  return ar->x;
 return stanga(ar->st);
 }
void max(arbore *ar)
 {
 if(ne<2)
  fprintf(g,"-1\n");
 else
  fprintf(g,"%lld\n",(dreapta(ar)-stanga(ar)));
 }
void min(arbore *ar)
 {
 if(ar==NULL) return;
 min(ar->dr);
 x[(++n)%2]=ar->x;
 if(n)
  {
  if(mn==-1||(mn>abs(x[n%2]-x[(n-1)%2])))
   mn=abs(x[n%2]-x[(n-1)%2]);
  }
 min(ar->st);
 }
int main()
 {
 int i;
 ll x;
 A=NULL;
 while(fgets(s,25,f))
  {
  i=0;
  while(s[i]>='A')   o[i]=s[i++];
  i++;
  if(i==4)
   {
   if(o[1]=='A')
    {
    max(A);
    }
   else
    {
	if(ne>=2)
	 {
	 mn=n=-1;
     min(A);
	 fprintf(g,"%lld\n",mn);
	 }
	else
	 fprintf(g,"-1\n");
    }
   }
  else 
   {
   x=0;
   while(s[i]>='0'&&s[i]<='9')x=x*10+(s[i++]-'0');
   if(o[0]=='S')
	del(A,x);
   if(o[0]=='I')
    insert(A,x);
   if(o[0]=='C')
	search(A,x);
   }
  }
 return 0;
 }