Cod sursa(job #516705)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 25 decembrie 2010 21:12:24
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 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);}
      
long binar(long h[200001],long l,long k,long x)
{long p;
if(l>k)
     return -1;
if(h[l]==x)
     return l;
if(h[2*l]<=x)
     if(h[2*l+1]<=x)
            {p=binar(h,2*l,k,x);
            if(p==-1)
                  return binar(h,2*l+1,k,x);
            else
                  return p;}
     else
            return binar(h,2*l,k,x);
else
     return binar(h,2*l+1,k,x);}

int main()
{int t;
long h[200001],n,k=0,i,p,j=0,v[200001];
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);}
              else
                      del(h,&k,binar(h,1,k,v[p]));}}
fclose(stdin);
fclose(stdout);
return 0;}