Cod sursa(job #891349)

Utilizator marinutzacatana marina marinutza Data 25 februarie 2013 16:07:33
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<iostream>
#include<cstdio>
#define nmax 200010
using namespace std;
int n,x,cod,in[nmax],a[2*nmax],p[nmax],i,k;
void urc(int i)
{
    if(i/2>=1)
    {
        if(a[i/2]>a[i])
        {
            swap(a[i/2],a[i]);
            p[a[i]]=i;
            p[a[i/2]]=i/2;
            urc(i/2);
        }
    }
}
void pop(int x)
{
    int r;
    a[x]=a[k--];
    while(2*x<=k)
    {
        int min=a[2*x];
        r=2*x;
        if(2*x+1<=k && min>a[2*x+1])
        {
            min=a[2*x+1];
            r=2*x+1;
        }
        swap(a[x],a[r]);
        p[a[x]]=x;
        p[a[r]]=r;
        x=r;
    }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&cod);
        switch(cod)
        {
            case 1:
                scanf("%d",&x);
                in[++k]=x;
                a[k]=x;
                urc(k);
                break;
            case 2:
                scanf("%d",&x);
                pop(p[in[x]]);
                break;
            case 3:
                printf("%d\n",a[1]);
                break;
        }
    }
    return 0;
}