Cod sursa(job #528816)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 3 februarie 2011 15:15:38
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<iostream.h>
#include<fstream.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 k,long poz[N])
{(*n)++;
h[(*n)]=k;
poz[h[(*n)]]=(*n);
long t=(*n),key,x,y;
key=h[t];
x=poz[h[t/2]];
y=poz[h[t]];
while(t>1&&key<h[t/2])
      {poz[h[t/2]]=y;
      y=x;
      h[t]=h[t/2];
      t/=2;}
poz[key]=t;
h[t]=key;}

void del(long h[N],long *n,long k,long poz[N])
{long key,son,aux,x,y,z;
h[k]=h[(*n)--];
poz[h[k]]=k;
if(k>1&&h[k]<h[k/2])
      {key=h[k];
      x=poz[h[k/2]];
      y=poz[h[k]];
      while(k>1&&key<h[k/2])
            {poz[h[k/2]]=y;
            y=x;
            h[k]=h[k/2];
            k/=2;}
      poz[key]=k;
      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;
                    z=poz[h[k]];
                    poz[h[k]]=poz[h[son]];
                    poz[h[son]]=z;
                    k=son;}}
      while(son);}}

int main()
{ifstream f1("heapuri.in");
ofstream f2("heapuri.out");
f1>>n;
for(i=1;i<=n;i++)
      {f1>>z;
      if(z==3)
              f2<<h[1]<<endl;
      else
              {f1>>r;
              if(z==1)
                      {v[++j]=r;
                      add(h,&k,v[j],poz);}
              else
                      del(h,&k,poz[v[r]],poz);}}
f1.close();
f2.close();
return 0;}