Cod sursa(job #1743861)

Utilizator cuvacalapecoLilian Grindea cuvacalapeco Data 18 august 2016 20:46:46
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <fstream>

#define MAX_ELEMS 200001u

using namespace std;

struct HeapNod
{
    unsigned int val;
    size_t nod;
}Heap[MAX_ELEMS], aux;

unsigned int Log[MAX_ELEMS];

size_t node_nr = 0;

inline size_t parent(size_t y)
{
    return (y/2);
}

inline size_t left(size_t y)
{
    return (y*2);
}

inline size_t right(size_t y)
{
    return (y*2 + 1);
}

void print()
{
    for(size_t i = 1; i <= node_nr; i++)
        cout << Heap[i].val << " ";
    cout << endl;
}

void heapify(size_t node)
{
   unsigned int aaux, crt_node = node;

    while(Heap[crt_node].val < Heap[parent(crt_node)].val && crt_node > 1 && crt_node <= node_nr)
    {
        aaux = Log[Heap[crt_node].nod];
        Log[Heap[crt_node].nod] = Log[Heap[parent(crt_node)].nod];
        Log[Heap[parent(crt_node)].nod] = aaux;

        aux = Heap[crt_node];
        Heap[crt_node] = Heap[parent(crt_node)];
        Heap[parent(crt_node)] = aux;

        crt_node = parent(crt_node);
    }
}

void inserare(unsigned int elem)
{
    node_nr++;
    Heap[node_nr].val = elem;
    Heap[node_nr].nod = node_nr;
    Log[node_nr] = node_nr;

    heapify(node_nr);
}

void eliminare(unsigned int poz)
{
    if(poz == node_nr)
    {
        node_nr--;
        return;
    }

    Heap[poz] = Heap[node_nr];
    node_nr--;

    heapify(poz); //de modificat heapifyul
    heapify(left(poz));
    heapify(right(poz));
}

unsigned int minim()
{
    return Heap[1].val;
}

int main()
{

    unsigned int N, opt, elem;
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");
    fin >> N;

    for(size_t k = 0; k < N; k++)
    {
        fin >> opt;
        if(opt == 1)
        {
            fin >> elem;
            inserare(elem);
            continue;
        }
        if(opt == 2)
        {
            fin >> elem;
            eliminare(Log[elem]);
            continue;
        }
        if(opt == 3)
        {
            fout << minim() << "\n";
        }
    }
    fin.close();
    fout.close();

    return 0;
}