Cod sursa(job #303303)

Utilizator cheery_g1rlHaller Emanuela cheery_g1rl Data 9 aprilie 2009 18:52:58
Problema Heapuri Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.68 kb
var m,lh,aux,n,x,i:longint;
    poz,h,ind:array[1..200000] of longint;
procedure sus(k,m:longint);
   var key:longint;
   begin
     key:=h[k];
     while(k>1)and(key<h[k div 2]) do
        begin
          h[k]:=h[k div 2];
          i:=ind[k div 2];
          poz[i]:=k; ind[k]:=i;
          k:=k div 2;
        end;
  if key<>h[k] then begin   h[k]:=key; ind[k]:=m; poz[m]:=k;end;
   end;
procedure jos(i:longint);
   var s,d,min,ii,im:longint;
   begin
     s:=2*i; d:=2*i+1; min:=i;
     if (s<=lh)and(h[s]<h[min]) then min:=s;
     if (d<=lh)and(h[d]<h[min]) then min:=d;
     if min<>i then
       begin
         ii:=ind[i]; im:=ind[min];
         aux:=h[i]; h[i]:=h[min]; h[min]:=aux;
         poz[ii]:=min; poz[im]:=i;
         ind[i]:=im; ind[min]:=ii;
         jos(min);
       end;
   end;
begin
assign(input,'heapuri.in'); reset(input);
assign(output,'heapuri.out'); rewrite(output);
readln(n);
lh:=0; m:=0;
while (n>=1) do
  begin
    read(x);
    if x=3 then begin writeln(h[1]); readln; end
           else if x=1 then
               begin
                 readln(x);
                 inc(lh); h[lh]:=x;
                 inc(m); poz[m]:=lh;
                 ind[lh]:=m;
                 sus(lh,m);
               end
                       else
                         begin
                           readln(x);
                           h[poz[x]]:=h[lh];
                           i:=ind[lh]; poz[i]:=poz[x]; ind[poz[x]]:=i;
                           dec(lh);
                           sus(poz[x], ind[poz[x]]);
                           jos(poz[x]);
                         end;
    dec(n);
  end;
close(input); close(output);
end.