Cod sursa(job #1042714)

Utilizator CaligulaGAIVS IVLIVS CAESAR AVGVSTVS GERMANICVS Caligula Data 27 noiembrie 2013 17:03:39
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<cstdio>
#include<cstring>
using namespace std;
struct elem
{
    int x,y;
} a[200005];
int m,n,t,x,y,nr,w[200005];
void interschimba(int poz1, int poz2)
{
    elem aux=a[poz1]; a[poz1]=a[poz2], a[poz2]=aux;
    w[a[poz1].y]=poz1, w[a[poz2].y]=poz2;
}
void reconstituie_heap(int s, int lung)
{
    int minim=s;
    if (2*s<=lung && a[minim].x>a[2*s].x) minim=2*s;
    if (2*s+1<=lung && a[minim].x>a[2*s+1].x) minim=2*s+1;
    if (minim!=s)
    {
        interschimba(s,minim);
        reconstituie_heap(minim,lung);
    }
}
int main()
{
    int i;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&m);
    for (i=0;i<m;++i)
    {
        scanf("%d",&t);
        if (t==3)
        {
            reconstituie_heap(1,n);
            printf("%d\n",a[1].x);
        }
        else
        {
            scanf("%d",&x);
            if (t==1)
            {
                a[++n].x=x, a[n].y=++nr, w[nr]=n;
                y=n;
                if (y>1 && a[y/2].x>a[y].x)
                {
                    interschimba(y/2,y);
                    y/=2;
                }
                while (y>1 && a[y/2].x>a[y].x)
                {
                    reconstituie_heap(y/2,n);
                    y/=2;
                }
            }
            else
            {
                y=w[x];
                interschimba(w[x],n);
                --n;
                while (y && a[y/2].x>a[y].x)
                {
                    reconstituie_heap(y,n);
                    y/=2;
                }
            }
        }
    }
    return 0;
}