Cod sursa(job #259888)

Utilizator mika17Mihai Alex Ionescu mika17 Data 16 februarie 2009 00:02:36
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <stdio.h>   
#include <stdlib.h>   
#include <string.h>   
  
#define le(K) K << 1   
#define ri(K) (K << 1) + 1   
#define fa(K) K >> 1   
#define MINP 1   
#define NEWP ++HSZ   
#define MAX_SZ 200001   
  
int H[MAX_SZ],HSZ,pos[MAX_SZ],S[MAX_SZ];   
  
void hswap(int x,int y) {   
     
        int aux = pos[H[x]]; pos[H[x]] = pos[H[y]]; pos[H[y]] = aux;  
        aux = H[x]; H[x] = H[y]; H[y] = aux;   
}   
  
int dip(int K) {   
    
        int p; 
        
        while(1) {   
         p = K;
         if(le(K) <= HSZ && S[H[le(K)]] < S[H[p]])   
          p = le(K);  
         if(ri(K) <= HSZ && S[H[ri(K)]] < S[H[p]])   
          p = ri(K);   
         if(p != K) hswap(K,p), K = p;
          else break;  
        }   
        return K;   
}   
  
int lift(int K) {   
  
        while(fa(K) && H[K] < H[fa(K)])   
         hswap(K,fa(K)), K = fa(K);   
  
        return K;   
}   
  
inline int get(int K) {   
  
        return H[K];   
}   
  
int del(int K) {       //returneaza valoarea de pe poz K   
  
        int sav = H[K];   
        hswap(K,HSZ--);   
        dip(K);   
        return sav;   
}   
int set(int K,int v) {  //returneaza pozitia finala pe care s-a inserat   
  
        H[K] = v;   
  
        pos[v] = K;   
  
        if(le(K) <= HSZ && S[H[K]] > S[H[le(K)]] || ri(K) <= HSZ && S[H[K]] > S[H[ri(K)]])   
          return dip(K);   
         else if(fa(K) && H[K] < H[fa(K)]) return lift(K);   
  
        return K;   
}   
  
int main() {   
  
        freopen("heapuri.in","r",stdin);   
        freopen("heapuri.out","w",stdout);   
  
        int N;   
           
        scanf("%d",&N);   
  
        int op,x,i = 0;

        while(N--) {   
  
                scanf("%d",&op);   

                switch(op) {   
  
                        case 1: scanf("%d",&S[++i]);   
                                set(NEWP,i);   
                                break;   
  
                        case 2: scanf("%d",&x);   
                                del(pos[x]);   
                                break;   
  
                        case 3: printf("%d\n",S[get(MINP)]);
                           }   
  
                   }   
           }