Cod sursa(job #545641)

Utilizator zseeZabolai Zsolt zsee Data 3 martie 2011 18:50:23
Problema Heapuri Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.58 kb
var v:array[1..200001] of longint;
 n,m,i,a,b:longint;
 be,ki:text;
 br:array[1..200000] of longint;
 br_n:longint;

function apa( i:longint ):longint;
begin
 apa := i div 2;
end;

function bfiu( i:longint ):longint;
begin
 bfiu := i*2;
end;

function jfiu( i:longint ):longint;
begin
 jfiu := i*2+1;
end;

procedure felvisz( i:longint );
var p:longint;
begin
 while (i<>1)and( v[apa(i)] > v[i] ) do
  begin
   p := v[i];
   v[i] := v[apa(i)];
   v[apa(i)] := p;
   i := apa(i);
  end;
end;

function mini(a,b:longint):longint;
begin
 if v[a] < v[b] then mini := a else mini := b;
end;

procedure levisz( i:longint );
var m,p:longint;
begin
 m:=mini( bfiu(i), jfiu(i) );
 while ( m <= n )
    and ( v[m] < v[i] ) do
   begin
    p := v[i];
    v[i] := v[m];
    v[m] := p;
    i := m;
    m := mini( bfiu(i), jfiu(i) );
   end;
end;

procedure berak( x:longint );
begin
 inc(n);
 inc(br_n);
 br[br_n] := x;
 v[n] := x;
 felvisz(n);
end;

procedure torol( i:longint );
begin
 v[i] := v[n];
 dec(n);
 levisz(i);
end;

function min():longint;
begin
 min := v[1];
end;

function find( x:longint ):longint;
var i:longint;
begin
 for i:=1 to n+1 do
   if v[i] = x then break;
 if i <= n then find := i else find := 0;
end;

begin
 assign(be,'heapuri.in');
 assign(ki,'heapuri.out');
 reset(be);
 rewrite(ki);
 readln(be,m);
 for i:=1 to m do
  begin
   read(be,a);
   if (a=1) or (a=2) then read(be,b);
   case a of
     1: berak(b);
     2: torol( find(br[b]) );
     3: writeln(ki, min());
    end;
  end;
 close(ki);
end.