Cod sursa(job #712571)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 13 martie 2012 16:32:37
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
using namespace std;

int a[200005],dim_heap,v[200005],aux,lg;

void reconst_heap (int x)
{
    int min;
    if (2*x<=dim_heap && a[2*x]<a[x])
        min=2*x;
    else min=x;
    if (2*x+1<=dim_heap && a[2*x+1]<a[min])
        min=2*x+1;
    if (min!=x)
    {
        aux=a[x];
        a[x]=a[min];
        a[min]=aux;
        aux=v[x];
        v[x]=v[min];
        v[min]=aux;
        reconst_heap(min);
    }
}

void insert (int x)
{
    dim_heap++;
    int i=dim_heap;
    while (i>1 && a[i/2]>x)
    {
        a[i]=a[i/2];
        v[i/2]=i;
        i/=2;
    }
    a[i]=x;
    v[++lg]=i;
}

void del (int x)
{
    a[x]=a[dim_heap];
    dim_heap--;
    if (x>1 && a[x]<a[x/2])
    {
        while (x>1 && a[x]<a[x/2])
        {
            aux=a[x];
            a[x]=a[x/2];
            a[x/2]=a[x];
            aux=v[x];
            v[x]=v[x/2];
            v[x/2]=v[x];
            x/=2;
        }
    }
    else
        reconst_heap(x);
}

int main ()
{
    int i,tip,nr,x,ord;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&x);
    for (i=1; i<=x; i++)
    {
        scanf("%d",&tip);
        if (tip==1)
        {
            scanf("%d",&nr);
            insert(nr);
        }
        if (tip==2)
        {
            scanf("%d",&ord);
            del(v[ord]);
        }
        if (tip==3)
            printf("%d\n",a[1]);
    }
    return 0;
}