Cod sursa(job #1135906)
Utilizator | Data | 8 martie 2014 15:38:22 | |
---|---|---|---|
Problema | Heapuri | Scor | 20 |
Compilator | fpc | Status | done |
Runda | Arhiva educationala | Marime | 2.53 kb |
program heap;
var H,intr : array [1..200005] of longint;
i,n,a,b,t,j : longint;
procedure swap(var x,y : longint);
var aux : longint;
begin
aux:=x;
x:=y;
y:=aux;
end;
procedure coboara( n, k : longint);
var fiu : 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;
if fiu<>0 then begin
swap(H[k],H[fiu]);
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
H[k]:=H[k div 2];
k:=k div 2;
end;
H[k]:=aux;
end;
procedure sterge(var n : longint ; k : longint);
begin
H[k]:=H[n];
n:=n-1;
if ((k>1) and (H[k]>H[k div 2])) then ridica(n,k)
else coboara(n,k);
end;
begin
assign(input,'heapuri.in'); reset(input);
assign(output,'heapuri.out'); rewrite(output);
readln(t); n:=0;
for i:=1 to t do begin
read(a);
if a=1 then begin
readln(b);
n:=n+1;
H[n]:=b;
intr[n]:=b;
ridica(n,n);
end
else
if a=3 then writeln(H[1])
else
if a=2 then begin
readln(b);
for j:=1 to n do
if H[j]=intr[b] then begin
sterge(n,j);
break;
end;
end;
end;
close(input);
close(output);
end.