Cod sursa(job #827535)

Utilizator plusplusRares M. plusplus Data 2 decembrie 2012 11:07:33
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>
#define NMAX 200001

using namespace std;

FILE *fin = fopen("heapuri.in", "r");
FILE *fout = fopen("heapuri.out", "w");

int N, M, K;
int A[NMAX], H[NMAX], P[NMAX];

// A[i] = pozitia in Heap celui de-al i-lea element
// H[i] = valoarea elementului de pe pozitia i in heap
// P[i] = j (a i-a pozitie in Heap este al j-lea intrat)

void swap(int nod, int up) {
    int t;
    t = A[P[nod]];
    A[P[nod]] = A[P[up]];
    A[P[up]] = t;
    t = P[nod];
    P[nod] = P[up];
    P[up] = t;
    t = H[nod];
    H[nod] = H[up];
    H[up] = t;
}

void HeapUp(int nod) {
    if(nod < 1) return;
    if(H[nod] < H[nod / 2]) {
        swap(nod, nod / 2);
        HeapUp(nod / 2);
    }
}

void HeapDown(int nod) {
    int l, r, i;
    l = nod * 2;
    r = nod * 2 + 1;
    if(l <= K && H[l] < H[nod]) i = l;
    else i = nod;
    if(r <= K && H[r] < H[i]) i = r;
    if(i != nod) {
        swap(i, nod);
        HeapDown(i);
    }
}

void HeapCheck(int nod) {
    if(H[nod] < H[nod / 2]) HeapUp(nod);
    else HeapDown(nod);
}

void ReadData() {
    int i, val, cod;
    fscanf(fin, "%d", &N);
    for(i = 1; i <= N; ++ i) {
        fscanf(fin, "%d", &cod);
        if(cod == 3) {
            fprintf(fout, "%d\n", H[1]);
            continue;
        }
        else fscanf(fin, "%d", &val);
        if(cod == 1) {
            A[++ M] = ++ K;
            P[K] = M;
            H[K] = val;
            HeapUp(K);
        } else {
            if(A[val] == -1) fprintf(fout, "BUG!\n");
            H[A[val]] = H[K];
            P[A[val]] = P[K];
            -- K;
            HeapCheck(A[val]);
            A[val] = -1;
        }
    }
}

int main() {
    ReadData();
    return 0;
}