Cod sursa(job #303551)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 9 aprilie 2009 23:15:02
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <fstream>
#include <sstream>
#include <algorithm>
using namespace std;
const int Inf=1000000001;
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 Rotleft(T* &n){
     T *P=n->left;
     n->left=P->right;
     P->right=n;
     n=P;
     }
void Rotright(T* &n){
     T *P=n->right;
     n->right=P->left;
     P->left=n;
     n=P;
     }
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);
     if (n->left->prt > n->prt)
       Rotleft(n),Update(n->right);
     else
     if (n->right->prt > n->prt)
       Rotright(n),Update(n->left);
     Update(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)
           Rotright(n),Erase(n->left,x);
         else 
           Rotleft(n),Erase(n->right,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;
    }