Cod sursa(job #1634626)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 6 martie 2016 14:14:22
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

const int Nmax = 200005;
int Heap[Nmax], Pos[Nmax], A[Nmax], m, Nheap, n;

void Swap(int x, int y)
{
    swap(Heap[x], Heap[y]);
    swap(Pos[Heap[x]], Pos[Heap[y]]);
}

void Upheap(int nod)
{
    int tata = nod/2;
    if(tata && A[Heap[tata]] > A[Heap[nod]])
    {
        Swap(tata, nod);
        Upheap(tata);
    }
}

void Downheap(int nod)
{
    int son = 2*nod;
    if(son > Nheap) return;
    if(son == Nheap && A[Heap[son]] < A[Heap[nod]])
    {
        Swap(nod, son);
        return;
    }
    if(A[Heap[son]] < A[Heap[son+1]])
    {
        if(A[Heap[son]] < A[Heap[nod]])
        {
            Swap(nod, son);
            Downheap(son);
        }
    }
    else
    {
        if(A[Heap[son+1]] < A[Heap[nod]])
        {
            Swap(nod, son+1);
            Downheap(son+1);
        }
    }
}

int main()
{
    f>>n;
    while(n--)
    {
        int opt, x;
        f>>opt;
        if(opt == 1)
        {
            f>>x;
            A[++m] = x;
            Heap[++Nheap] = m;
            Pos[m] = Nheap;
            Upheap(Nheap);
        }
        if(opt == 2)
        {
            f>>x;
            int pos = Pos[x];
            Swap(pos,Nheap--);
            Downheap(pos);
        }
        if(opt == 3) g<<A[Heap[1]]<<'\n';
    }
    return 0;
}