Cod sursa(job #946593)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 4 mai 2013 22:31:56
Problema Heapuri Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.75 kb
program heapuri;
  var a:array[1..200000]of longint;
      order,poz:array[1..200000]of longint;
      n,i,k,x,heapsize:longint;
      bufin,bufout:array[1..100000] of byte;
      op:byte;

procedure heapify(i:longint);
  var min,x:longint;
  begin
    min:=i;
    if (2*i<=heapsize)and(a[2*i]<a[min])then min:=2*i;
    if (2*i+1<=heapsize)and(a[2*i+1]<a[min]) then min:=2*i+1;
    if min<>i then
      begin
        x:=a[i];
        a[i]:=a[min];
        a[min]:=x;
        x:=order[i];
        order[i]:=order[min];
        order[min]:=x;
        poz[order[i]]:=i;
        poz[order[min]]:=min;
        heapify(min);
      end;
  end;

procedure insert(x:longint);
  var i:longint;
  begin
    inc(heapsize);
    a[heapsize]:=x;
    i:=heapsize;
    order[i]:=k;
    poz[order[i]]:=i;
    while (i<>1)and(a[i div 2]>a[i]) do
      begin
        x:=a[i div 2];
        a[i div 2]:=a[i];
        a[i]:=x;
        x:=order[i div 2];
        order[i div 2]:=order[i];
        order[i]:=x;
        poz[order[i]]:=i;
        poz[order[i div 2]]:=i div 2;
        i:=i div 2;
      end;
  end;

function min:longint;
  begin
    min:=a[1];
  end;

procedure delete(i:longint);

  begin
    a[i]:=a[heapsize];
    order[i]:=order[heapsize];
    poz[order[i]]:=i;
    dec(heapsize);
    heapify(i);
  end;

begin
  assign(input,'heapuri.in');
  reset(input);
  settextbuf(input,bufin);
  assign(output,'heapuri.out');
  rewrite(output);
  settextbuf(output,bufout);
  readln(n);
  for i:=1 to n do
    begin
      read(op);
      case op of
        1: begin readln(x);inc(k);insert(x);end;
        2: begin readln(x);delete(poz[x]);end;
        3: writeln(min);
        end;
    end;
  close(input);close(output);
end.