Cod sursa(job #329259)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 5 iulie 2009 15:05:18
Problema Zeap Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.35 kb
# include <cstdio>
# include <time.h>
# include <stdlib.h>
# include <string.h>

using namespace std;

# define FIN "zeap.in"
# define FOUT "zeap.out"

# define min(a, b) (a < b ? a : b)

# define MAX_L 5
# define inf 0x3f3f3f3f

struct lista
{
    lista *st, *dr;
    int val, prt, min, max, mind;
} *Z, *p;

int val;
char s[MAX_L];

     void update(lista *&nod)
     {
         nod -> mind = inf;
         nod -> min = nod -> max = nod -> val;
         
         if (nod -> st != NULL)
         {
             nod -> min = nod -> st -> min;
             nod -> mind = min(nod -> mind, nod -> st -> mind);
             nod -> mind = min(nod -> mind, nod -> val - nod -> st -> max);
         }
         
         if (nod -> dr != NULL)
         {
             nod -> max = nod -> dr -> max;
             nod -> mind = min(nod -> mind, nod -> dr -> mind);
             nod -> mind = min(nod -> mind, nod -> dr -> min - nod -> val);
         }
     }

     void rotst(lista *&f)
     {   
         p = f -> st; f -> st = p -> dr; p -> dr = f; f = p;
     }
     
     void rotdr(lista *&f)
     {
         p = f -> dr; f -> dr = p -> st; p -> st = f; f = p;
     }

     void balance(lista *&f)
     {
         if (f -> st != NULL)
            if (f -> st -> prt > f -> prt) 
            {
                rotst(f);
                update(f -> dr);
            }
            
         if (f -> dr != NULL)
            if (f -> dr -> prt > f -> prt) 
            {
                rotdr(f);
                update(f -> st);
            }
            
         update(f);
     }

     void Insert(lista *&f, int val)
     {
         lista *p;
         
         if (f == NULL)
         {
             p = new lista;
             
             p -> st = p -> dr = NULL;
             p -> mind = inf; p -> prt = rand();
             p -> val = p -> min = p -> max = val;
             
             f = p;
             
             return;
         }
         
         if (val == f -> val) return;
         
         if (val < f -> val) Insert(f -> st, val);
         else Insert(f -> dr, val);
         
         balance(f);
     }
     
     int Search(lista *f, int val)
     {
          if (f == NULL) return 0;
          if (f -> val == val) return 1;
          
          if (val < f -> val) return Search(f -> st, val);
          else return Search(f -> dr, val);
     }
     
     void Delete(lista *&f, int val)
     {
         if (f == NULL)
         {
             printf("-1\n");
             return;
         }
         
         if (val < f -> val) Delete(f -> st, val);
         if (val > f -> val) Delete(f -> dr, val);
         
         if (val == f -> val)
         {
             if (f -> st == NULL && f -> dr == NULL)
             {
                 delete f;
                 f = NULL;
                 return;
             }
             
             if (f -> st == NULL) rotdr(f);
             else if (f -> dr == NULL) rotst(f);
             else if (f -> st -> prt > f -> dr -> prt) rotst(f);
             else rotdr(f);
             
             Delete(f, val);
         }
         
         update(f);
     }

     int main()
     {
         freopen(FIN, "r", stdin);
         freopen(FOUT, "w", stdout);
      
         Z = NULL;
         srand(time(NULL));
         for (; scanf("%s", s + 1) != EOF; )
         {
             if (s[1] == 'I')
             {
                scanf("%d", &val);
                Insert(Z, val);
              
                continue;
              }
          
             if (s[1] == 'S')
             {
                scanf("%d", &val);
                Delete(Z, val);
              
                continue;
             }
          
             if (s[1] == 'C')
             {
                scanf("%d", &val);
                printf("%d\n", Search(Z, val));
              
                continue;
              }
          
             if (s[1] == 'M' && s[2] == 'A')
             {
                if (Z -> max != Z -> min) printf("%d\n", Z -> max - Z -> min);
                else printf("-1\n");
              
                continue;
             }
          
             if (Z -> mind != inf) printf("%d\n", Z -> mind);
             else printf("-1\n");
      }
      
      return 0;
  }