Cod sursa(job #530207)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 februarie 2011 11:01:59
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<fstream.h>
#include<iostream.h>
#define N 200001
int z;
long h[N],n,k=0,i,r,j=0,poz[N],v[N];

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

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