Cod sursa(job #303485)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 9 aprilie 2009 21:24:08
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <fstream>
#include <sstream>
using namespace std;
const int Inf=2000000000;
struct T{
    int key,prt;
    int Min,Max,mindif;
    T *left,*right;
    T() {}
    T(int K,int P,T *L,T *R){
      this->key=K;
      this->prt=P;
      this->left=L;
      this->right=R;
      }     
    } *R,*nil;
void Init(){
     srand((unsigned)time(0));
     R=nil=new T(0,0,NULL,NULL);
     R->mindif=nil->mindif=Inf;
     R->Min=nil->Min=Inf;
     R->Max=nil->Max=-Inf;
     }
int Search(T *n,int x){
    if (n==nil) return 0;
    if (n->key==x) return 1;
    if (n->key>x) return Search(n->left,x);
    return Search(n->right,x);
    }
void Update(T* &n){
     n->Max=max(n->key,n->right->Max);
     n->Min=min(n->key,n->left->Min);
     n->mindif=min(min(n->left->mindif,n->right->mindif),
                   min(n->key - n->left->Max, n->right->Min - n->key));
     } 
void notleft(T* &n){
     T *P=n->left;
     n->left=P->right;
     P->right=n;
     Update(n);Update(P);
     n=P;
     }
void notright(T* &n){
     T *P=n->right;
     n->right=P->left;
     P->left=n;
     Update(n);Update(P);
     n=P;
     }
void Balance(T* &n){
     if (n->prt < n->left->prt) 
       notleft(n);
     else
     if (n->prt < n->right->prt)
       notright(n);
     Update(n);
     } 
void Insert(T* &n,int x,int p){
     if (n==nil) {n=new T(x,p,nil,nil);
                  Update(n); 
                  return;}
     if (n->key>x) Insert(n->left,x,p);
     else Insert(n->right,x,p);
     Balance(n);
     }
void Erase(T* &n,int x){
     if (n==nil) return;
     if (n->key>x) Erase(n->left,x);
     else if (n->key<x) Erase(n->right,x);
     else
        if (n->left==nil && n->right==nil)
         {delete n,n=nil;return;}
        else
        {
         if (n->right->prt > n->left->prt)
           notright(n);
         else 
           notleft(n);
         Erase(n,x);
        } 
     Update(n);
     }
int main(){
    ifstream f("zeap.in");
    ofstream g("zeap.out");
    string s,op;
    int N=0,x;
    Init();
    while (getline(f,s)){
      istringstream is(s);
      is>>op;
      if (op=="I") {is>>x;if (!Search(R,x)) Insert(R,x,1+rand()),++N;}
      else
      if (op=="S") {is>>x;if (Search(R,x)) Erase(R,x),--N;
                                      else g<<"-1\n";}
      else
      if (op=="C") {is>>x;g<<Search(R,x)<<'\n';}
      else 
      if (op=="MAX") {if (N>=2) g<<R->Max - R->Min<<'\n';
                            else g<<"-1\n";}
      else
      if (op=="MIN") {if (N>=2) g<<R->mindif<<'\n';
                            else g<<"-1\n";} 
     
      }
    f.close();g.close();
    return 0;
    }