Cod sursa(job #914913)

Utilizator cat_red20Vasile Ioana cat_red20 Data 14 martie 2013 16:20:16
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<stdio.h>
#define MAXN 200000
int h[MAXN+1],poz[MAXN+1],n,el,op,x,val[MAXN+1],u;

void promovare(int k)
{
    int x=val[k];
    int p=h[k];
    while(x<val[h[k/2]] && k/2>=1)
    {
        poz[h[k/2]]=k;
        h[k]=h[k/2];
        val[k]=val[k/2];
        k=k/2;
    }
    poz[p]=k;
    h[k]=p;
    val[k]=x;
}

void insereaza(int x)
{
    int k;
    el++;
    u++;
    h[u]=el;
    val[u]=x;
    k=u;
    promovare(k);
}

void reconst(int p)
{
    int st,dr,min,t;
    while(2*p<=u)
    {
        st=2*p;
        dr=2*p+1;
        min=p;
        if(val[p]>val[st])
        {
            min=st;
        }
        if(dr<=u && val[min]>val[dr])
        {
            min=dr;
        }
        if(min!=p)
        {
            t=h[min];
            h[min]=h[p];
            h[p]=t;
            t=val[min];
            val[min]=val[p];
            val[p]=t;
            poz[h[min]]=min;
            poz[h[p]]=p;
            p=min;
        }
        else
        break;
    }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d",&x);
            insereaza(x);
        }
        else
        if(op==2)
        {
            scanf("%d",&x);
            h[poz[x]]=h[u];
            poz[h[u]]=poz[x];
            val[poz[x]]=val[u];
            u--;
            if(!(val[poz[x]]<val[poz[x]/2]))
            {
                reconst(poz[x]);
            }
            else
            {
                promovare(poz[x]);
            }
        }
        else
        {
            printf("%d\n",val[1]);
        }
    }
    return 0;
}