Cod sursa(job #766105)

Utilizator mi5humihai draghici mi5hu Data 10 iulie 2012 12:38:14
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <stdio.h>
using namespace std;

int H[200001];
int HSize;

int Time[200001];
int Time_p[200001];
int T;

void sw_val(int &a, int &b) {
     int aux = a;
     a = b;
     b = aux;
}

void sw(int poz1, int poz2) {
     sw_val(H[poz1], H[poz2]);          
     sw_val(Time[poz1], Time[poz2]);
     sw_val(Time_p[Time[poz1]], Time_p[Time[poz2]]);
}

void heapify_up(int poz) {
     while (poz > 1 && H[poz] < H[poz / 2]) {
           sw(poz, poz/2);
           poz = poz / 2;      
     } 
}

void heapify_down(int poz) {
     bool ok = false;
     while (ok == false) {
        int min_child = poz * 2;
        int max_child = min_child + 1;
        if (max_child <= HSize && H[min_child] > H[max_child]) {
           sw_val(max_child, min_child);         
        }
        
        if (min_child <= HSize && H[min_child] < H[poz]) {
           sw(min_child, poz);
           poz = min_child;              
        } else if (max_child <= HSize && H[max_child] < H[poz]) {
           sw(max_child, poz);
           poz = max_child;       
        } else {
           ok = true;
        }       
     }
}

void insert_(int val) {
     HSize++;
     H[HSize] = val;
          
     T++;
     Time_p[T] = HSize;
     Time[HSize] = T;
     heapify_up(HSize);         
}

void delete_(int t) {
     int poz = Time_p[t];     
     if (T >= t && t >= 1 && poz <= HSize) {
         sw(poz, HSize);
         HSize--;
         heapify_down(poz);                 
     }
}

void print_min() {
     printf("%d\n",H[1]);      
}

void solve_() {
     int n, a, b;
     scanf("%d", &n); 
     for (int i = 0; i < n; i++) {
         scanf("%d", &a);
         switch (a) {
                case 1:
                     scanf("%d", &b);
                     insert_(b);
                     break;
                case 2:
                     scanf("%d", &b);
                     delete_(b);
                     break;
                case 3:
                     print_min();
                     break;
                default:
                     break;        
         }        
     }     
}

int main() {
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    
    solve_();
    
    return 0;
}