Pagini recente » Cod sursa (job #1601555) | Cod sursa (job #1135656) | Cod sursa (job #1947379) | Probleme de Taietura | Cod sursa (job #1179595)
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.