Cod sursa(job #1636053)

Utilizator edim98Eduard Constantinescu edim98 Data 6 martie 2016 22:03:45
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define N 200000

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int Heap[N + 5], poz[N + 5], A[N + 5];
int n, m, nHeap;

void Swap(int x, int y)
{
    swap(Heap[x], Heap[y]);
    swap(poz[Heap[x]], poz[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 fiu = 2*nod;
    if(fiu > nHeap)
        return;
    if(fiu == nHeap && A[Heap[fiu]] < A[Heap[nod]])
    {
        Swap(nod, fiu);
        return;
    }
    if(A[Heap[fiu]] < A[Heap[fiu+1]])
        if(A[Heap[fiu]] < A[Heap[nod]])
        {
            Swap(nod, fiu);
            Downheap(fiu);
        }
        else;
    else if(A[Heap[fiu+1]] < A[Heap[nod]])
    {
        Swap(nod, fiu+1);
        Downheap(fiu+1);
    }
}

int main()
{
    int cod, x;

    fin >> n;
    for(int i = 1; i <= n; i++)
    {
        fin >> cod;
        if(cod == 1)
        {
            fin >> x;
            A[++m] = x;
            Heap[++nHeap] = m;
            poz[m] = nHeap;
            Upheap(nHeap);
        }
        else if(cod == 2)
        {
            fin >> x;
            int aux = poz[x];
            Swap(aux, nHeap--);
            Downheap(aux);
        }
        else
            fout << A[Heap[1]] << '\n';
    }
    return 0;
}