Cod sursa(job #1132068)
Utilizator | Data | 2 martie 2014 16:26:53 | |
---|---|---|---|
Problema | Heapuri | Scor | 20 |
Compilator | fpc | Status | done |
Runda | Arhiva educationala | Marime | 2.63 kb |
program heap;
var H,sol : array [1..200000] of longint;
k,i,n,a,b,t,j,l : longint;
procedure coboara( n, k : longint);
var fiu,aux : longint;
begin
repeat
fiu:=0;
if k*2<n then
begin
fiu:=k*2;
if H[k*2+1]<H[k*2] then fiu:=k*2+1;
if H[fiu]>=H[k] then fiu:=0
end
else if k*2=n then
begin
fiu:=k*2;
if H[fiu]>=H[k] then fiu:=0;
end;
if fiu<>0 then begin
aux:=H[k];
H[k]:=H[fiu];
H[fiu]:=aux;
k:=fiu;
end;
until fiu=0;
end;
procedure ridica(n,k : longint);
var aux: longint;
begin
aux:=H[k];
while ((k<>1)and(aux<H[k div 2])) do begin
aux:=H[k];
H[k]:=H[k div 2];
H[k div 2]:=aux;
k:=k div 2;
end;
H[k]:=aux;
end;
begin
assign(input,'heapuri.in'); reset(input);
assign(output,'heapuri.out'); rewrite(output);
readln(t);
for k:=1 to t do begin
read(a);
if a=3 then begin readln;
for i:=n div 2 downto 1 do coboara(n,i);
writeln(H[1]);
end else
if a=2 then begin
readln(b);
for j:=1 to n do
if sol[b]=H[j] then
begin
H[j]:=H[n];
n:=n-1;
if ((j>1) and (H[j]>H[j div 2])) then ridica(n,j)
else coboara(n,j);
end;
end else
if a=1 then begin
readln(b);
n:=n+1;
H[n]:=b;
l:=l+1;
sol[l]:=H[l];
ridica(n,n);
end;
end;
close(input);
close(output);
end.