Cod sursa(job #2759998)

Utilizator rapidu36Victor Manz rapidu36 Data 22 iunie 2021 12:01:26
Problema Heapuri Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <stdio.h>
#include <stdlib.h>
#define N 200001

int v[N], h[N], poz[N], nh, n;

void schimba(int p1, int p2)
{
    ///schimba intre ele elem. de pe poz. p1 si p2
    int aux = h[p1];
    h[p1] = h[p2];
    h[p2] = aux;
    poz[h[p1]] = p1;
    poz[h[p2]] = p2;
}

void urca(int p)
{
    while (p > 1 && v[h[p]] < v[h[p/2]])///cat timp elem. curent e mai bun ca tatal sau
    {
        schimba(p, p/2);
        p /= 2;///continuam urcarea
    }
}

void adauga(int val)
{
    h[++nh] = val;///il pun la final pentru a avea arb. bin. complet
    urca(nh);///pentru a pastra proprietatea de heap
}

void coboara(int p)
{
    ///daca h[p] e mai rau ca (cel putin) unul dintre fii
    ///il schimb cu cel mai bun dintre fii
    int fs = 2*p, fd = 2*p + 1, bun = p;
    if (fs <= nh && v[h[fs]] < v[h[bun]])///fiul stang exista si e mai bun ca tatal
    {
        bun = fs;
    }
    if (fd <= nh && v[h[fd]] < v[h[bun]])///fiul drept exista si e mai bun ca tatal
    {
        bun = fd;
    }
    if (bun != p)///unul dintre fii e mai bun ca tatal
    {
        schimba(p, bun);
        coboara(bun);///coboram in continuare pentru a reface heap-ul
    }
}

void sterge(int p)
{
    ///sterge elem. de pe pozitia p in heap
    if (p == nh)
    {
        nh--;
    }
    else
    {
        h[p] = h[nh--];
        poz[h[p]] = p;
        urca(p);
        coboara(p);
    }
}

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