Cod sursa(job #2545818)

Utilizator copanelTudor Roman copanel Data 13 februarie 2020 16:00:33
Problema Heapuri Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>

int v[200001];
int h[200001];
int pos[200001];
int nh, nc;

void schimba(int ah, int bh) {
    int aux;
    aux = h[ah];
    h[ah] = h[bh];
    h[bh] = aux;

    pos[h[ah]] = ah;
    pos[h[bh]] = bh;
}

void urca(int ih) {
    while (ih > 1 && v[h[ih]] < v[h[ih / 2]]) {
        schimba(ih, ih / 2);
        ih /= 2;
    }
}

void adauga(int x) {
    h[++nh] = x;
    pos[x] = nh;
    urca(nh);
}

void coboara(int ih) {
    int fs = ih * 2, fd = ih * 2 + 1;
    int bun = ih;
    if (fs <= nh && v[h[fs]] < v[h[bun]]) {
        bun = fs;
    }
    if (fd <= nh && v[h[fd]] < v[h[bun]]) {
        bun = fd;
    }
    if (bun != ih) {
        schimba(bun, ih);
        coboara(bun);
    }
}

void sterge(int ih) {
    schimba(nh--, ih);
    urca(ih);
    coboara(ih);
}

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

    fscanf(fin, "%d", &n);

    int i;
    for (i = 0; i < n; i++) {
        int op, x;
        fscanf(fin, "%d", &op);

        switch (op) {
        case 1:
            fscanf(fin, "%d", &x);
            v[++nc] = x;
            adauga(nc);
            break;
        case 2:
            fscanf(fin, "%d", &x);
            sterge(pos[x]);
            break;
        case 3:
            fprintf(fout, "%d\n", v[h[1]]);
            break;
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}