Cod sursa(job #1389867)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 16 martie 2015 18:22:26
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <cstdio>

const int MAXN = 200010;

int heap[MAXN];
int nheap = 0;
int indice_heap[MAXN];  //indexare de la 1, pentru interogari

int indice_indice_heap[MAXN]; //pentru fiecare element din heap care
//este indicele sau corespunzator in vectorul indice_heap

int nr_elem_inserate = 0;

 //interschimba 2 elem, pastrand referintele corecte si in vectorii indice_heap
 //si indice_indice_heap
void interschimba_elemente(int poz1, int poz2)
{
    int v1 = indice_indice_heap[poz1];
    int v2 = indice_indice_heap[poz2];
    int aux = heap[poz1];
    heap[poz1] = heap[poz2];
    heap[poz2] = aux;

    aux = indice_heap[v1];
    indice_heap[v1] = indice_heap[v2];
    indice_heap[v2] = aux;
    aux = indice_indice_heap[poz1];
    indice_indice_heap[poz1] = indice_indice_heap[poz2];
    indice_indice_heap[poz2] = aux;
}

void lift(int poz)
{
    while (poz != 1 && heap[poz/2] > heap[poz])
    {
        interschimba_elemente(poz,poz/2);
        poz /= 2;
    }
}

void sink(int poz)
{
    while (2*poz <= nheap)
    {
        int pozf1 = 2*poz;
        int pozf2 = 2*poz+1;
        int pozfmin;
        if (pozf2 <= nheap && heap[pozf2] < heap[pozf1])
            pozfmin = pozf2;
        else
            pozfmin = pozf1;
        if (heap[pozfmin] < heap[poz])
        {
            interschimba_elemente(poz,pozfmin);
            poz = pozfmin;
        }
        else
            break;
    }
}

void inserare_heap(int x)
{
    ++nheap; //indexare de la 1
    heap[nheap] = x;

    ++nr_elem_inserate;
    indice_heap[nr_elem_inserate] = nheap;
    indice_indice_heap[nheap] = nr_elem_inserate;

    lift(nheap);
}

void sterge_elem(int poz) //sterge elem de la pozitia poz din heap
{
    interschimba_elemente(nheap,poz); //se putea si fara interschimbare, pt referinte
    --nheap;
    if (poz != 1 && heap[poz/2] > heap[poz])
        lift(poz);
    else sink(poz); //incearca
}


void citire_si_prelucrare()
{
    int n;
    scanf("%d",&n);
    for (int i = 0; i < n; i++)
    {
        int op,x;
        scanf("%d",&op);
        if (op == 1 || op == 2)
            scanf("%d",&x);
        if (op == 1)
            inserare_heap(x);
        else if (op == 2)
            sterge_elem(indice_heap[x]);
        else
            printf("%d\n",heap[1]); //presupunem ca exista elemente
    }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    citire_si_prelucrare();
    return 0;
}