Cod sursa(job #516686)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 25 decembrie 2010 18:12:28
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
void percolate(long h[200001],long n,long k)
{long key=h[k];
while(k>1&&key<h[k/2])
      {h[k]=h[k/2];
      k/=2;}
h[k]=key;}

void sift(long h[200001],long n,long k)
{long son,aux;
do
      {son=0;
      if(2*k<=n)
             {son=2*k;
             if(2*k+1<=n&&h[2*k+1]<h[2*k])
                      son=2*k+1;
             if(h[son]>=h[k])
                      son=0;}
      if(son)
             {aux=h[k];
             h[k]=h[son];
             h[son]=aux;
             k=son;}}
while(son);}

void add(long h[200001],long *n,long k)
{h[++(*n)]=k;
percolate(h,(*n),(*n));}

void del(long h[200001],long *n,long k)
{h[k]=h[(*n)];
--(*n);
if(k>1&&h[k]<h[k/2])
      percolate(h,(*n),k);
else
      sift(h,(*n),k);}

int main()
{int t;
long h[200001],n,k=0,i,p,j=0,v[200001],l;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%ld",&n);
for(i=1;i<=n;i++)
      {scanf("%d",&t);
      if(t==3)
              printf("%ld\n",h[1]);
      else
              {scanf("%ld",&p);
              if(t==1)
                      {v[++j]=p;
                      add(h,&k,p);
                      print(h,k);}
              else
                      {for(l=1;l<=k;l++)
                      if(v[p]==h[l])
                             del(h,&k,l);
                      print(h,k);}}}
fclose(stdin);
fclose(stdout);
return 0;}