Cod sursa(job #236936)

Utilizator floringh06Florin Ghesu floringh06 Data 28 decembrie 2008 19:27:48
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define FIN "heapuri.in"
#define FOUT "heapuri.out"
#define MAX_N 200000

int H[MAX_N];
int P[MAX_N];

int C[MAX_N];

int N, K;

    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])
               {
                  P[H[c]] = s, P[H[s]] = c;
                  int ax = H[c]; H[c] = H[s], H[s] = ax;
                  
                  c = s;
               }
               else return;
         }
    }
    
    void lift (int c)
    {
         while (c > 1)
         {
               int t = c >> 1;
               
               if (H[c] < H[t])
               {
                        P[H[c]] = t, P[H[t]] = c;
                        int ax = H[c]; H[c] = H[t], H[t] = ax;
                        
                        c = t;
               }     
               else c = 1;
         }
    }
    
    void insert (int c)
    {
         H[++K] = c; 
         P[c] = K;
         lift (K);
    }
    
    void dispose (int p)
    {
         H[p] = H[K--];
         P[H[K + 1]] = p;
         if (H[p] < H[p >> 1] && p > 1) lift (p);
            else sink (p);
    }

    int main ()
    {
        int cod, x, ind = 0;
        
        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) insert (x), C[++ind] = x;
                   else dispose (P[C[x]]);
              }
        }
        
        return 0;
    }