Cod sursa(job #523842)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 19 ianuarie 2011 15:53:26
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<stdio.h>
#define N 200001
int z;
long h[N],n,k=0,i,p,j=0,v[N],t[N];

void add(long h[N],long *n,long k)
{h[++(*n)]=k;
long t=(*n),key;
key=h[t];
while(t>1&&key<h[t/2])
      {h[t]=h[t/2];
      t/=2;}
h[t]=key;}

void del(long h[N],long *n,long k)
{long key,son,aux;
h[k]=h[(*n)];
--(*n);
if(k>1&&h[k]<h[k/2])
      {key=h[k];
      while(k>1&&key<h[k/2])
            {h[k]=h[k/2];
            k/=2;}
      h[k]=key;}
else
      {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);}}
      
long binar(long h[N],long l,long k,long x)
{long p;
if(l>k)
     return 0;
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==0)
                  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()
{freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%ld",&n);
for(i=1;i<=n;i++)
      {scanf("%d",&z);
      if(z==3)
              printf("%ld\n",h[1]);
      else
              {scanf("%ld",&p);
              if(z==1)
                      {v[++j]=p;
                      add(h,&k,p);}
              else
                      del(h,&k,binar(h,1,k,v[p]));}}
fclose(stdin);
fclose(stdout);
return 0;}