Cod sursa(job #249596)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 28 ianuarie 2009 20:27:17
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>
long n,lh,ll,i,aa,p;
long a[200100],h[200100],hp[200100];
void push(long A)
{long hh;
 while(A/2&&a[h[A]]<a[h[A/2]])
     {hh=h[A];h[A]=h[A/2];h[A/2]=hh;
      hp[h[A]]=A;hp[h[A/2]]=A/2;A/=2;}
}
void pop(long A)
{long hh,aa=0;
 while(A!=aa)
  {aa=A;
   if(aa*2<=lh&&a[h[A]]>a[h[aa*2]])A=aa*2;
   if(aa*2+1<=lh&&a[h[A]]>a[h[aa*2+1]])A=aa*2+1;
   hh=h[A];h[A]=h[aa];h[aa]=hh;
   hp[h[A]]=A;hp[h[aa]]=aa;}
}
int main()
{
 freopen("heapuri.in","r",stdin);
 freopen("heapuri.out","w",stdout);
 scanf("%ld",&n);
 for(i=1;i<=n;i++)
    {scanf("%ld",&p);
     if(p<3)
       scanf("%ld",&aa);
     if(p==1)
     {lh++,ll++;
      a[ll]=aa;
      h[lh]=ll;
      hp[ll]=lh;
      push(lh);}
     if(p==2)
     {a[aa]=-1;push(hp[aa]);
      hp[h[1]]=0;h[1]=h[lh--];
      hp[h[1]]=1;
      if(lh>1)pop(1);}
     if(p==3)printf("%ld\n", a[h[1]]);
    }
 return 0;
}