Cod sursa(job #894200)

Utilizator marinutzacatana marina marinutza Data 26 februarie 2013 20:11:55
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<iostream>
#include<cstdio>
#define nmax 200010
using namespace std;
struct arb
{
    int nr;
    int ord;
} a[nmax];
int n,x,cod,p[nmax],i,k;
void urc(int i)
{
    if(i/2>=1)
    {
        if(a[i/2].nr>a[i].nr)
        {
            swap(p[a[i/2].ord],p[a[i].ord]);;
            swap(a[i/2],a[i]);
            urc(i/2);
        }
    }
}
void pop(int x)
{
    int r;
    a[x]=a[k--];
    p[a[x].ord]=x;
    while(2*x<=k)
    {
        int min=a[2*x].nr;
        r=2*x;
        if(2*x+1<=k && min>a[2*x+1].nr)
        {
            min=a[2*x+1].nr;
            r=2*x+1;
        }
        if(a[x].nr>a[r].nr)
        {
            swap(p[a[x].ord],p[a[r].ord]);
            swap(a[x],a[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);
                    a[++k].nr=x;
                    a[k].ord=k;
                    p[k]=k;
                    urc(k);
                    break;
                case 2:
                    scanf("%d",&x);
                    pop(p[x]);
                    break;
                case 3:
                    printf("%d\n",a[1].nr);
            }
        }
    }
    return 0;
}