Cod sursa(job #494758)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 22 octombrie 2010 20:02:59
Problema Heapuri Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.49 kb
program heapuri;
const maxn=200001;
type elem=0..maxn;
var f,g:text; v:array[elem] of longint; pos,H:array[elem] of elem;
x:byte; y,i:longint; n,m,hp:elem;

procedure upheap(k:elem);
var key:longint;
begin
key:=H[k];
While (k>1)and(v[key]<v[H[k div 2]]) do
 begin
 pos[H[k div 2]]:=pos[H[k]];
 H[k]:=H[k div 2];
 k:=k div 2;
 H[k]:=key;
 pos[H[k]]:=k;
 end;
end;
procedure swap(var a:longint; var b:longint);
var aux:longint;
begin
aux:=a;
a:=b;
b:=aux;
end;
procedure downheap(k:elem);
var son:elem;
begin
Repeat
son:=0;
If 2*k<=hp then
 begin
 son:=2*k;
 If (2*k+1<=hp)and(v[H[son]]>v[H[2*k+1]]) then son:=2*k+1;
 If v[H[son]]>v[H[k]] then son:=0;
 end;
If son>0 then
 begin
 swap(pos[H[son]],pos[H[k]]);
 swap(H[son],H[k]);
 k:=son;
 end;
Until son=0;
end;
procedure delete(k:elem); {k= pozitia in heap}
begin
pos[H[hp]]:=k;
H[k]:=H[hp];
k:=pos[H[k]];
dec(hp);
If (k>1)and(v[H[k]]<v[H[k div 2]]) then upheap(k)
                                   else downheap(k);

end;
procedure insert(y:longint);
begin
inc(n); inc(hp);
H[hp]:=n;   {H= pozitia elementului din heap in vector}
pos[n]:=hp; {pos= pozitia elementului din vector in heap}
v[n]:=y;
upheap(hp);
end;

begin
Assign(f,'heapuri.in'); Reset(f);
Assign(g,'heapuri.out');Rewrite(g);
Readln(f,m);
For i:=1 to m do
 begin
 Read(f,x);
 If x<3 then Readln(f,y)
        else Readln(f);
 case x of
 1: insert(y);
 2: delete(pos[y]);
 3: Writeln(g,v[H[1]]);
  end;
 end;
Close(f); Close(g);
end.