Cod sursa(job #1042883)

Utilizator Iustin_BulimarFMI Iustin Bulimar Iustin_Bulimar Data 27 noiembrie 2013 19:27:49
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");

int n, t, x, h[200001], e[200001], p[200001], l, v, k;

void push(int x, int &l, int &k)
{
    int i;
    i=++l;
    h[i]=x;
    while(h[i/2]>h[i] && i>1)
    {
        swap(h[i/2], h[i]);
        swap(p[i], p[i/2]);
        e[p[i]]=i;
        e[p[i/2]]=i/2;
        i/=2;
    }
    e[++k]=i;
    p[i]=k;
}

bool minim(int i, int &j)
{
    if(i*2>l) return 0;
    else
    {
        if(i*2+1>l) j=i*2;
        else
            if(h[i*2]<h[i*2+1]) j=i*2;
            else j=i*2+1;
        return 1;
    }
}

void pop(int i)
{
    int j;
    bool k;
    h[i]=h[l];
    p[i]=p[l];
    e[p[i]]=i;
    h[l--]=0;
    k=minim(i, j);
    while(i<=l && h[i]>h[j] && k)
    {
        swap(h[i], h[j]);
        swap(p[i], p[j]);
        e[p[i]]=i;
        e[p[j]]=j;
        i=j;
        k=minim(i, j);
    }
}
int main()
{
    for(cin>>n; n>0; n--)
    {
        cin>>t;
        if(t==3) cout<<h[1]<<'\n';
        else
        {
            cin>>x;
            if(t==1) push(x, l, k);
            else pop(e[x]);
        }
    }

    return 0;
}