Cod sursa(job #3356683)

Utilizator rapidu36Victor Manz rapidu36 Data 3 iunie 2026 09:12:42
Problema Heapuri Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>

#define N 200000

int h[N+1], poz_h[N+1], val[N+1], n_h, n_val;

void schimba(int p1, int p2) {
    // interschimba elementele din heap aflate pe pozitiile p1 si p2
    int aux = h[p1];
    h[p1] = h[p2];
    h[p2] = aux;
    poz_h[h[p1]] = p1;
    poz_h[h[p2]] = p2;
}

int tata(int p) {
    // p = pozitie din h
    return (p / 2);
}

int fiu_stang(int p) {
    return (2 * p);
}

int fiu_drept(int p) {
    return (2 * p + 1);
}

void urca(int p) {
    // p = pozitie din h
    while (tata(p) >= 1 && val[h[p]] < val[h[tata(p)]]) {
        schimba(p, tata(p));
    }
}

void adauga(int p) {
    h[++n_h] = p; // p = pozitie din val
    poz_h[p] = n_h;
    urca(n_h);
}

void coboara(int p) {
    int p_min = p;
    if (fiu_stang(p) <= n_h && val[h[fiu_stang(p)]] < val[h[p_min]]) {
        p_min = fiu_stang(p);
    }
    if (fiu_drept(p) <= n_h && val[h[fiu_drept(p)]] <= val[h[p_min]]) {
        p_min = fiu_drept(p);
    }
    if (p_min != p) {
        schimba(p_min, p);
        coboara(p_min);
    }
}

void sterge(int p) {
    // p = poz in heap
    if (p != n_h) {
        schimba(p, n_h);
    }
    n_h--;
    urca(p);
    coboara(p);
}

int main(void) {
    FILE *in = fopen("heapuri.in", "r");
    FILE *out = fopen("heapuri.out", "w");
    int n_op;
    fscanf(in, "%d", &n_op);
    for (int i=0; i<n_op; i++) {
        int tip;
        fscanf(in, "%d", &tip);
        if (tip == 1) {
            fscanf(in, "%d", &val[++n_val]);
            adauga(n_val);
        } else if (tip == 2) {
            int p;
            fscanf(in, "%d", &p); // poz in val
            sterge(poz_h[p]);
        } else {
            fprintf(out, "%d\n", val[h[1]]);
        }
    }
    fclose(in);
    fclose(out);
    return 0;
}