Cod sursa(job #1636200)

Utilizator Sergiu1256Ionita Sergiu1256 Data 6 martie 2016 23:38:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

#define N 200011
 
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 = 0; 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;
}