Cod sursa(job #250214)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 30 ianuarie 2009 13:02:16
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.51 kb
#include <cstdio>   
#include <cstring>   
  
using namespace std;   
  
#define FIN "heapuri.in"   
#define FOUT "heapuri.out"   
#define MAX_N 200005   
  
int H[MAX_N];   
int P[MAX_N];   
  
int C[MAX_N];   
  
int dec[MAX_N];   
  
int N, K, ind;   
  
    void sink (int c)   
    {   
         while (c << 1 <= K)   
         {   
               int s = c << 1;   
               if (s|1 <= K && H[s] > H[s|1]) s |= 1;   
                  
               if (H[s] < H[c])   
               {   
                  int ax;   
                  ax = dec[c], dec[c] = dec[s], dec[s] = ax;   
                  ax = H[c], H[c] = H[s], H[s] = ax;   
                     
                  P[dec[c]] = c, P[dec[s]] = s;   
                     
                  c = s;   
               }   
               else return;   
         }   
    }   
       
    void lift (int c)   
    {   
         while (c > 1)   
         {   
               int t = c >> 1;   
                  
               if (H[c] < H[t])   
               {   
                        int ax;   
                        ax = dec[c], dec[c] = dec[t], dec[t] = ax;   
                        ax = H[c], H[c] = H[t], H[t] = ax;   
                           
                        P[dec[c]] = c, P[dec[t]] = t;   
                           
                        c = t;   
               }        
               else c = 1;   
         }   
    }   
       
    void insert (int c)   
    {   
         H[++K] = c;    
         lift (K);   
    }   
       
    void dispose (int p)   
    {   
         H[p] = H[K--];   
         if (H[p] < H[p >> 1] && p > 1) lift (p);   
            else sink (p);   
    }   
  
    int main ()   
    {   
        int cod, x;   
           
        freopen (FIN, "r", stdin);   
        freopen (FOUT, "w", stdout);   
           
        scanf ("%d", &N);   
        while (N--)   
        {   
              scanf ("%d", &cod);   
              if (cod == 3) printf ("%d\n", H[1]);   
              else    
              {   
                   scanf ("%d", &x);   
                   if (cod == 1)   
                   {   
                           C[++ind] = x;   
                           P[ind] = K + 1;   
                           dec[K + 1] = ind;   
                           insert (x);   
                   }   
                   else dispose (P[x]);   
              }   
        }   
           
        return 0;   
    }