Cod sursa(job #1525302)

Utilizator FayedStratulat Alexandru Fayed Data 14 noiembrie 2015 22:23:19
Problema Heapuri Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 2.4 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 200001

int Heap[NMAX];
int N;

int father(int node) {
    return node/2;
}

int left_child(int node) {
    return node<<1;
}

int right_child(int node) {
    return 2 * node + 1;
}

void swap(int *x, int *y) {
    
    int aux;
    aux = *x;
    *x  = *y;
    *y  = aux;
}

int getMin(int Heap[NMAX]) {
    return Heap[1];
}

void goDown(int Heap[NMAX], int N, int K) {
    
    int child;
    
    do{
        child = 0;
        
        if(left_child(K) <= N) {
            child = left_child(K);
            
            if(right_child(K) <= N && Heap[right_child(K)] < Heap[child]) {
                child = right_child(K);
            }
            if(Heap[K] < Heap[child]) {
                child = 0;
            }
        }
        if(child) {
            swap(&Heap[child], &Heap[father(child)]);
            K = child;
        }
    } while(child);
}

void goUp(int Heap[NMAX], int N, int K) {
    
    int key = Heap[K];
    
    while(K > 1 && key < Heap[father(K)]) {
        Heap[K] = Heap[father(K)];
        K = father(K);
    }
    
    Heap[K] = key;
}

void insertHeap(int Heap[NMAX], int N, int key) {
    
    Heap[++N] = key;
    goUp(Heap, N, N);
}

void deleteHeap(int Heap[NMAX], int N, int K) {
    
    Heap[K] = Heap[N--];
    
    if(K > 1 && (Heap[K] > Heap[father(K)])) {
        goUp(Heap, N, K);
    }
    else
        goDown(Heap, N, K);
}

void buildHeap(int Heap[NMAX], int N) {
    for(int nodes = N / 2; nodes > 0; --nodes) {
        goDown(Heap, N, nodes);
    }
}

void reads() {
    
    freopen("heapuri.in",  "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &N);
}

int main(void) {
    
    int code, k, x, poz[NMAX];
    reads();
    
    k = 0;
    
    for(int i = 1; i <= N; ++i) {
        
        scanf("%d", &code);
        
        if(code != 3) {
            if(code == 1) {
                
                scanf("%d", &Heap[++k]);
                poz[k] = Heap[k];
                
                if(k > 1)
                    insertHeap(Heap, k - 1, Heap[k]);
            } else {
                scanf("%d", &x);
                
                for(int j = 1; j <= i; ++j)
                    if(Heap[j] == poz[x]) {
                        deleteHeap(Heap, k, j);
                        break;
                    }
            }
        } else {
            printf("%d\n", getMin(Heap));
        }
    }
    return 0;
}