Cod sursa(job #2287375)

Utilizator mirunazMiruna Zavelca mirunaz Data 21 noiembrie 2018 20:17:00
Problema Heapuri Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.28 kb
#include<stdio.h>
#define INF 1000000001
typedef struct {
    int val, poz;
} elem;

int fiu_dr(int nod)
{
    return 2*nod + 1;
}

int fiu_st(int nod)
{
    return 2*nod;
}

int tata(int nod)
{
    return nod/2;
}

void Schimb(int nod1, int nod2, elem v[], int p[])
{
    elem aux = v[nod1]; v[nod1] = v[nod2]; v[nod2] = aux;
    p[v[nod1].poz] = nod1;
    p[v[nod2].poz] = nod2;
}

void HeapUp(int nod, elem v[], int p[])
{
    while(nod > 1 && v[tata(nod)].val > v[nod].val) {
        Schimb(tata(nod), nod, v, p);
        nod = tata(nod);
    }
}

void HeapDown(int nod, elem v[], int p[], int m)
{
    while((fiu_dr(nod) < m && v[fiu_dr(nod)].val < v[nod].val) || (fiu_st(nod) < m && v[fiu_st(nod)].val < v[nod].val))
    {
        if(v[fiu_st(nod)].val < v[nod].val && v[fiu_st(nod)].val < v[fiu_dr(nod)].val) {
            Schimb(fiu_st(nod), nod, v, p);
            nod = fiu_st(nod);
        } else {
            Schimb(fiu_dr(nod), nod, v, p);
            nod = fiu_dr(nod);
        }
    }
}

void Insert(FILE *in, int m, elem v[], int poz, int p[])
{
    int x;
    fscanf(in, "%d", &x);
    v[m].val = x;
    v[m].poz = poz;
    p[poz] = m;
    HeapUp(m, v, p);
}

void Delete(FILE *in, int m, elem v[], int p[])
{
    int x;
    fscanf(in, "%d", &x);
    x = p[x];
    Schimb(x, m, v, p);
    v[m].val = INF;
    HeapUp(x, v, p);
    HeapDown(x, v, p, m);
}

void Min(FILE *out, elem v[])
{
    fprintf(out, "%d\n", v[1].val);
}

void Afisare(FILE *out, int m, int poz, elem v[], int p[])
{
    int i;
    for (i=1; i<=m; i++)
        fprintf (out, "%d %d\n", v[i].val, v[i].poz);
    for (i=1; i<=poz; i++)
        fprintf(out, "%d ", p[i]);
}

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

    int n, cod, m = 0, poz = 0;
    fscanf(in, "%d", &n);
    elem v[n+1];
    int p[n+1];

    while(n--) {
        fscanf(in, "%d", &cod);
        if(cod == 1) {
            m ++;
            poz ++;
            Insert(in, m, v, poz, p);
        }
        else if(cod == 2) {
            //int x; fscanf(in, "%d ", &x);
            Delete(in, m, v, p);
            m --;
        }
        else {
            Min(out, v);
        }
    }

    return 0;
}