Cod sursa(job #1179595)

Utilizator azkabancont-vechi azkaban Data 28 aprilie 2014 22:05:01
Problema Heapuri Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 2.63 kb
program heap;
var H,poz_heap,poz_intr : array [1..200005] of longint;
    k,i,n,a,b,t,j,l,nod: longint;
    b1,b2 : array[0..1 shl 17] of char;

procedure swap(var x,y : longint);
  var aux : longint;
    begin
       aux:=x;
       x:=y;
       y:=aux;
    end;

procedure coboara(k : longint);
  var fiu : longint;
    begin
         repeat
               fiu:=0;
               if k*2<=n then
                  begin
                       fiu:=k*2;
                       if  (k*2<n) then
                           if (H[k*2+1]<H[k*2]) then fiu:=k*2+1;
                       if H[fiu]>=H[k] then fiu:=0
                  end;
                  if fiu<>0 then begin
                                       swap(poz_intr[poz_heap[k]],poz_intr[poz_heap[fiu]]);
                                       swap(poz_heap[k],poz_heap[fiu]);
                                       swap(H[k],H[fiu]);
                                       k:=fiu;
                                 end;

         until fiu=0;
   end;

procedure ridica(nod : longint);
     begin
         if (nod>1) and (H[nod]<=H[nod div 2]) then begin
                                       swap(poz_intr[poz_heap[nod]],poz_intr[poz_heap[nod div 2]]);
                                       swap(poz_heap[nod],poz_heap[nod div 2]);
                                       swap(H[nod],H[nod div 2]);
                                       ridica(nod div 2);
                                                     end;
       end;

procedure sterge(var n : longint ; nod : longint);
  begin
    swap(poz_intr[poz_heap[nod]],poz_intr[poz_heap[n]]);
    swap(poz_heap[nod],poz_heap[n]);
    swap(H[nod],H[n]);
    n:=n-1;
    if (nod>1) and (H[nod]<H[nod div 2]) then ridica(nod)
                                         else coboara(nod);
  end;

procedure inserare(var n,l : longint; nod : longint) ;
  begin
      n:=n+1;
      H[n]:=nod;
      l:=l+1;
      poz_heap[n]:=l;
      poz_intr[l]:=n;
      ridica(n);
   end;

begin
   assign(input,'heapuri.in'); settextbuf(input,b1); reset(input);
   assign(output,'heapuri.out'); settextbuf(output,b2); rewrite(output);
   readln(t); l:=0; n:=0;
for k:=1 to t  do begin
   read(a);
   case a of
            3 : begin
                     writeln(H[1]);
                     readln;
                end;
            2 : begin
                     readln(b);
                     sterge(n,poz_intr[b]);
                 end;
            1 : begin
                     readln(b);
                     inserare(n,l,b);
                 end;
         end;
end;
   close(input);
   close(output);
end.