Cod sursa(job #408657)

Utilizator hungntnktpHungntnktp hungntnktp Data 3 martie 2010 10:06:53
Problema Heapuri Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 2.33 kb
{$M 64000000,0}
{$H-,I-,Q-,R-,S-}
{La Hoang
Ngay 3-3-2010}
const
   TFI  = 'heapuri.in';
   TFO  = 'heapuri.out';
   MaxN = 200000;
var
   fi, fo: text;
   n, x, y, nHeap, count: longint;
   A, Vt, H: array[1..MaxN] of longint;
   (*-----------------------------------*)
   procedure Up(node: longint);
   var
      root, x: longint;
   begin
      x := H[node];
      repeat
         root := node div 2;
         if (root = 0) or (A[H[root]] < A[x]) then break;
         H[node] := H[root];
         Vt[H[node]] := node;
         node := root;
      until false;
      H[node] := x;
      Vt[x] := node;
   end;
   (*-----------------------------------*)
   procedure Down(node: longint);
   var
      child, x: longint;
   begin
      x := H[node];
      repeat
         child := node * 2;
         if (child < nHeap) and (A[H[child]] > A[H[child + 1]]) then inc(child);
         if (child > nHeap) or (A[H[child]] > A[x]) then break;
         H[node] := H[child];
         Vt[H[node]] := node;
         node := child;
      until false;
      H[node] := x;
      Vt[x] := node;
   end;
   (*-----------------------------------*)
   procedure Push(i: longint);
   begin
      if Vt[i] = 0 then
         begin
            inc(nHeap);
            H[nHeap] := i;
            Vt[i] := nHeap;
         end;
      Up(Vt[i]);
   end;
   (*-----------------------------------*)
   function Pop: longint;
   begin
      Pop := H[1];
      H[1] := H[nHeap];
      Vt[H[nHeap]] := 1;
      dec(nHeap);
      if nHeap > 1 then Down(1);
   end;
   (*-----------------------------------*)
begin
   Assign(fi, TFI); Reset(fi);
   Assign(fo, TFO); Rewrite(fo);
   Fillchar(Vt, sizeof(Vt), 0);
   count := 0; nHeap := 0;
   Readln(fi, n);
   while n > 0 do
      begin
         dec(n);
         Read(fi, x);
         if x = 1 then
            begin
               inc(count);
               Readln(fi, A[count]);
               Push(count);
            end else
         if x = 2 then
            begin
               Readln(fi, y);
               A[y] := A[H[1]] - 1;
               Push(y);
               Pop;
            end else
         if x = 3 then
            begin
               WRiteln(fo, A[H[1]]);
               Readln(fi);
            end;
      end;
   Close(fo);
   Close(fi);
end.