Cod sursa(job #623747)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 20 octombrie 2011 18:11:10
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#define nm 200000
int h[nm],poz[nm],n,m,k,op,i,x,a[nm];
void insertheap(int ind,int nr)
{ int fiu,tata,z;
    fiu=ind;
    tata=ind/2;
    while(tata>0&&a[h[tata]]>a[h[fiu]])
        {
        z=h[tata];
        h[tata]=h[fiu];
        h[fiu]=z;
        poz[h[tata]]=tata;
        poz[h[fiu]]=fiu;
        fiu=tata;
        tata=fiu/2;
        }
}
void sterge(int pozitie)
{ int tata,fiu,z;

a[pozitie]=-1;
z=poz[pozitie];
poz[pozitie]=0;
poz[h[m]]=z;
h[z]=h[m]; h[m]=0; m--;
tata=z; fiu=tata*2;
while(fiu<=m)
    {
        if(fiu+1<=m) if(a[h[fiu]]>a[h[fiu+1]])fiu++;
               if(a[h[tata]]>a[h[fiu]])
                {
                    z=h[tata]; h[tata]=h[fiu]; h[fiu]=z;
                    poz[h[tata]]=tata;
                    poz[h[fiu]]=fiu;
                    tata=fiu; fiu=fiu*2;
                }
    }
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d\n",&n);
k=0;
m=0;
// 1 = inserare
// 2 = stergere
// 3 = afisare minim
for(i=1;i<=n;i++)
    {
        scanf("%d",&op);
        if(op==1||op==2)
            {
                scanf("%d",&x);
                if(op==1)
                    {m++; k++;
                     h[m]=k; a[k]=x; poz[k]=m;
                     insertheap(m,x);
                    }
                else sterge(x);

            }
        else printf("%d\n",a[h[1]]);
    }
fclose(stdin);
fclose(stdout);
return 0;
}