Pagini recente » Cod sursa (job #391236) | Cod sursa (job #3130061) | Cod sursa (job #906292) | Cod sursa (job #2834442) | Cod sursa (job #408657)
Cod sursa(job #408657)
{$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.