Cod sursa(job #355604)

Utilizator ionutz32Ilie Ionut ionutz32 Data 11 octombrie 2009 19:15:56
Problema Heapuri Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 2.34 kb
var v,p,r:array[1..200005] of longint;
m,i,cod,n,x,aux,a:longint;
f,g:text;
procedure perc(poz:longint);
          begin
          while (poz<>1) and (v[poz]<v[poz shr 1]) do
                begin
                aux:=v[poz];
                v[poz]:=v[poz shr 1];
                v[poz shr 1]:=aux;
                aux:=r[poz];
                r[poz]:=r[poz shr 1];
                r[poz shr 1]:=aux;
                p[r[poz]]:=poz;
                p[r[poz shr 1]]:=poz shr 1;
                poz:=poz shr 1;
                end;
          end;
procedure sift(poz:longint);
          begin
          while (poz<=n div 2) and ((v[poz]>v[poz*2]) or (v[poz]>v[poz*2+1])) do
                if (v[poz*2]<v[poz*2+1]) and (poz*2<=n) then
                   begin
                   aux:=v[poz];
                   v[poz]:=v[poz*2];
                   v[poz*2]:=aux;
                   aux:=r[poz];
                   r[poz]:=r[poz*2];
                   r[poz*2]:=aux;
                   p[r[poz]]:=poz;
                   p[r[poz*2]]:=poz*2;
                   poz:=poz*2;
                   end
                else
                    if (v[poz*2+1]<=v[poz*2]) and (poz*2+1<=n) then
                       begin
                       aux:=v[poz];
                       v[poz]:=v[poz*2+1];
                       v[poz*2+1]:=aux;
                       aux:=r[poz];
                       r[poz]:=r[poz*2+1];
                       r[poz*2+1]:=aux;
                       p[r[poz]]:=poz;
                       p[r[poz*2+1]]:=poz*2+1;
                       poz:=poz*2+1;
                       end;
          end;
begin
assign(f,'heapuri.in');
assign(g,'heapuri.out');
reset(f);rewrite(g);
readln(f,m);
for i:=1 to m do
    begin
    read(f,cod);
    case cod of
         1:begin
           inc(n);
           inc(a);
           readln(f,v[n]);
           p[a]:=n;
           r[n]:=a;
           perc(n);
           end;
         2:begin
           readln(f,x);
           v[p[x]]:=v[n];
           r[p[x]]:=r[n];
           p[r[n]]:=p[x];
           dec(n);
           if v[p[x]]<v[p[x] div 2] then
              perc(p[x])
           else
               sift(p[x]);
           end;
         3:begin
           writeln(g,v[1]);
           readln(f);
           end;
         end;
    end;
close(f);close(g);
end.