Cod sursa(job #967437)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 27 iunie 2013 18:09:26
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
#include <cstdio>
using namespace std;

int minim(int a,int b)
{
    if(a==0)
        return b;
    if(b==0)
        return a;
    if(a<b)
        return a;
    return b;
}
int val[200009],heap[200009],poz[200009];
int main()
{
    int n,i,op,nr,x,aux,j,m,fiu,numar;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    nr=0;
    numar=0;
    for(j=1;j<=n;j++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d",&x);
            nr++;
            numar++;
            poz[numar]=nr;
            val[numar]=x;
            heap[nr]=numar;
            i=nr;
            while(val[heap[i/2]]>val[heap[i]]&&i>1)
            {
                aux=heap[i/2];
                heap[i/2]=heap[i];
                heap[i]=aux;
                poz[heap[i]]=i;
                poz[heap[i/2]]=i/2;
                i=i/2;
            }
        }
        if(op==2)
        {
            scanf("%d",&x);
            heap[poz[x]]=heap[nr];
            heap[nr]=0;
            poz[heap[poz[x]]]=poz[x];
            i=poz[x];
            poz[x]=0;
            nr--;
            while(val[heap[i]]<val[heap[i/2]]&&i>1&&i<nr)
            {
                aux=heap[i];
                heap[i]=heap[i/2];
                heap[i/2]=aux;
                poz[heap[i]]=i;
                poz[heap[i/2]]=i/2;
                i=i/2;
            }
            m=minim(val[heap[2*i]],val[heap[2*i+1]]);
            if(m==val[heap[2*i]]&&2*i<=nr)
                fiu=2*i;
            else
                {
                    if(2*i+1<=nr)
                        fiu=2*i+1;
                    else
                        fiu=2*i;
                }
            while(val[heap[i]]>m&&nr/2>=i)
            {
                aux=heap[i];
                heap[i]=heap[fiu];
                heap[fiu]=aux;
                poz[heap[i]]=i;
                poz[heap[fiu]]=fiu;
                i=fiu;
                m=minim(val[heap[2*i]],val[heap[2*i+1]]);
                if(m==val[heap[2*i]]&&2*i<=nr)
                    fiu=2*i;
                else
                {
                    if(2*i+1<=nr)
                        fiu=2*i+1;
                    else
                        fiu=2*i;
                }
            }

        }
        if(op==3)
            printf("%d\n",val[heap[1]]);
    }
    return 0;
}