Cod sursa(job #1201018)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 24 iunie 2014 12:09:12
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.32 kb
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;
ifstream f("zeap.in");
ofstream o("zeap.out");
struct dat{
    int val,h,def,mi,ma;
    dat *dr,*st;
    dat(){
    val=0;
    h=def=mi=0;ma=10000000;
    dr=st=NULL;
    }
};
//typedef dat *lda;
int n,ok,minim;
dat *head;


dat *hight(dat *v){
      if(v->dr!=NULL && v->st!=NULL){
         v->h = max(v->dr->h,v->st->h)+1;
         v->def = v->dr->h - v->st->h;
     }else if(v->dr!=NULL || v->st!=NULL){
        if(v->dr!=0){
            v->h = v->dr->h+1;
            v->def = v->dr->h;
        }else{
            v->h = v->st->h+1;
            v->def = -v->st->h;
        }
     }else{
         v->h = 0;
         v->def = 0;
     }
        if(v->st!=0)
        v->mi = v->st->val;
        else v->mi=v->val;
        if(v->dr!=0)
        v->ma = v->dr->val;
        else v->ma = v->val;
     return v;
}
dat *rotleft(dat *v){
     dat *x = v->dr;
     v->dr = x->st;
     x->st = v;
     v = hight(v);
     x = hight(x);

     return x;
}
dat *rotright(dat *v){
     dat *x = v->st;
     v->st = x->dr;
     x->dr = v;
     v = hight(v);
     x = hight(x);
     return x;
}

dat *echilibru(dat *v){

 v = hight(v);


if(v->def==2){
    if(v->dr->def>=0)v = rotleft(v);
    else{
       v->dr = rotright(v->dr);
       v = rotleft(v);
    }
}
if(v->def==-2){
    if(v->st->def<=0)v = rotright(v);
    else {
           v->st = rotleft(v->st);
            v = rotright(v);
}

}
return v;
}
dat *adauga(dat *v, int x){

    if(v==0){
        dat *p = new dat;
        p->val = x;
        p->mi=x;
        p->ma=x;
        //v=p;
        return p;
    }

   // if(v->val==x)return v;
    //else
     if(v->val<=x)v->st = adauga(v->st,x);
    else v->dr = adauga(v->dr,x);
   /* if(v->st!=0)
        v->mi = v->st->val;
        else v->mi=0;
        if(v->dr!=0)
        v->ma = v->dr->val;
        else v->ma = 1000000;*/
    v = echilibru(v);
   /* if(v->st!=0)
        v->mi = v->st->val;
        else v->mi=0;
        if(v->dr!=0)
        v->ma = v->dr->val;
        else v->ma = 1000000;*/
    return v;
}
int cautamax(dat *nod){
  //  if(nod==0)return 0;
  if(nod->st==0)return nod->val;
  return cautamax(nod->st);
}
int cautamin(dat *nod){
 //   if(nod==0)return 0;
  if(nod->dr==0)return nod->val;
  return cautamin(nod->dr);
}
int cauta(int x,dat *v){
    if(v==0)return 0;
        if(v->val == x)return 1;
    if(v->val<=x) return cauta(x,v->st);
        else  return cauta(x,v->dr);
}
dat *sterge(int x,dat *v){
     if(v==0){ok = 1; return v; }
        if(v->val == x){
            if(v->dr==NULL && v->st==NULL){
                return 0;
            }else if(v->dr==NULL || v->st==NULL){
                if(v->dr==0)return v->st;
                else return v->dr;
            }else{
                dat *p;
                for(p=v->dr;p->st!=NULL;p=p->st);
                 v->val = p->val;
                v->dr =   sterge(p->val,v->dr);
                return echilibru(v);
            }
        }
        else
        if(v->val<=x) v->st = sterge(x,v->st);
        else  v->dr = sterge(x,v->dr);

        //return echilibru(v);
      /*  if(v->st!=0)
        v->mi = v->st->val;
        else v->mi=0;
        if(v->dr!=0)
        v->ma = v->dr->val;
        else v->ma = 100000;*/
        v = echilibru(v);
       /* if(v->st!=0)
        v->mi = v->st->val;
        else v->mi=0;
        if(v->dr!=0)
        v->ma = v->dr->val;
        else v->ma = 1000000;
*/

        return v;
}
int a[10000000],nr=0;
void parcurgere(dat *v){
    if(v==0)return;
if(v->dr!=0)parcurgere(v->dr);

   a[++nr]=v->val;
 //  o<<a[nr]<<" ";
  if(nr>1) if(nr>1 && a[nr]-a[nr-1]!=0)minim=min(minim,a[nr]-a[nr-1]);
  if(v->st!=0)parcurgere(v->st);
}
int main(){
//f>>n;
int x,y;
head= 0;


string s;

   while(f>>s){

    if(s== "MAX"){ if(head!=0){if(head->st!=0 || head->dr!=0) o<<cautamax(head) - cautamin(head)<<"\n";else o<<"-1\n";}else o<<"-1\n"; }else
   if(s==   "MIN" ){ nr=0;minim = 100000000;parcurgere(head);  o<<(minim!=100000000?minim:-1)<<"\n"; }else
   if(s==  "I" ){ f>>y;head = adauga(head,y); }else
  if(s==  "S" ){ f>>y; ok =0; head = sterge(y,head); if(ok)o<<-1<<"\n"; }else
   if(s== "C" ){ f>>y; o<<cauta(y,head)<<"\n"; }

   }
}