Cod sursa(job #1368563)

Utilizator sorynsooSorin Soo sorynsoo Data 2 martie 2015 18:32:26
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
using namespace std;
#include <fstream>
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
#define MAXIM 200015
int heap[MAXIM], lg, v[MAXIM], nr, poz[MAXIM];
void schimba(int a, int b)
{
    int aux = heap[a];
    heap[a] = heap[b];
    heap[b] = aux;
    poz[heap[a]] = a;
    poz[heap[b]] = b;
}
void adauga(int val)//percolate
{
    nr++; lg++;
    v[nr] = val; heap[lg] = nr; poz[nr] = lg;
    int tata = lg/2, fiu = lg;
    while(tata>=1 && v[heap[tata]]>val)
    {
        schimba(fiu, tata);
        fiu = tata;
        tata/=2;
    }
}
void sterge(int p) // shiftarea aia
{
    if(p<0 || p>nr)
        return;
    poz[heap[p]] = 0;
    heap[p] = heap[lg];
    poz[heap[p]] = p;
    heap[lg] = 0; --lg;
    int fiu;
    while(2*p<=lg)
    {
        if(2*p==lg)
        {
            if(v[heap[2*p]] < v[heap[p]])
                schimba(p, 2*p);
            return;
        }
        else
        {
            fiu = 2*p;
            if(v[heap[fiu]]>v[heap[fiu+1]]) // st > dr
                fiu++;
            if(v[heap[p]]>v[heap[fiu]])
            {
                schimba(p, fiu);
                p = fiu;
            }
            else
                return;
        }
    }
}
int main()
{
    int i, n, a, tip;
    cin>>n;
    for(i=1; i<=n; i++)
    {
        cin>>tip;
        if(tip==1)
        {
            cin>>a;
            adauga(a);
        }
        if(tip==2)
        {
            cin>>a;
            sterge(poz[a]);
        }
        if(tip==3)
            cout<<v[heap[1]]<<'\n';
    }
}