Cod sursa(job #892138)

Utilizator marinutzacatana marina marinutza Data 25 februarie 2013 22:30:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 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]);
            swap(p[i/2],p[i]);
            //p[i]=i/2;
            //p[i/2]=i;
            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]);
        swap(p[x],p[r]);
        //p[x]=r;
        //p[r]=x;
        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;
                p[k]=k;
                urc(k);
                break;
            case 2:
                scanf("%d",&x);
                pop(p[in[x]]);
                break;
            case 3:
                printf("%d\n",a[1]);
                break;
        }
    }
    return 0;
}