Cod sursa(job #1637146)

Utilizator TirauStelianTirau Ioan Stelian TirauStelian Data 7 martie 2016 15:19:50
Problema Heapuri Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 2.6 kb
Program heapu;
var a,heap,poz:array [0..200010] of longint;
    n,l,i,x,cod,nr,unu,j:longint;
    f,g:text;
  procedure push(l:longint);
  var aux:longint;
  begin
    aux:=0;
    while (l div 2>0) and (A[Heap[l]]<A[Heap[l div 2]]) do{cat timp mai am un tata si acesta nu este bun}
      begin
        aux:=Heap[l];
        Heap[l]:=Heap[l div 2];
        Heap[l div 2]:=aux;{interschimb valorile gresite din heap}
        aux:=poz[heap[l]];
        Poz[Heap[l]]:=poz[heap[l div 2]];
        Poz[Heap[l div 2]]:=aux;{interschimb valorile gresite din poz}
        l:=l div 2;{l ia valoarea tatalui sau}
      end;
  end;
  procedure pop(x:longint);
  var aux,y:longint;
  begin
    y:=0;
    aux:=0;
    while (x<>y)do{cat timp nu am gasit un fiu mai mare decat tatal}
      begin
        y:=x;
        if (y*2<=L) and (A[Heap[x]]>A[Heap[y*2]]) then
          x:=y*2;
        if (y*2+1<=L) and (A[Heap[x]]>A[Heap[y*2+1]]) then
          x:=y*2+1;
        aux:=Heap[x];
        Heap[x]:=Heap[y];
        Heap[y]:=aux;
        aux:=Poz[Heap[x]];
        Poz[Heap[x]]:=Poz[Heap[y]];
        Poz[Heap[y]]:=aux;
      end;
  end;
begin
  assign(f,'heapuri.in');reset(f);
  assign(g,'heapuri.out');rewrite(g);
  readln(f,n);
  for i:=1 to n do
    begin
      read(f,cod);
      if cod=1 then
        begin
          inc(l);{cresc numarul elementelor din heap}
          readln(f,x);{citesc un numar }
          a[l]:=x;{il adaug vectorului a care nu va suferi nici o modificare pana la sfarsit}
          heap[l]:=l;{ultimului numar din a ii dau ultima pozitie din heap pentru a respesta structura de heap}
          poz[l]:=l;{actualizez pozitia acestuia in heap in vectorul}
          push(l);{verific daca am pozitionat bine noul element in heap, in caz contrar voi gasii o pozitie corecta prin interschimbari repetate}
        end
      else
        if cod=2 then
          begin
            readln(f,x);{citesc pozitia elementului din a care va trebuii sters}
            a[x]:=-1;{il marchez cu o valoare negativa}
            push(poz[x]);{il urc pana in radacina, pentru a deveni minimul din heap}
            poz[heap[1]]:=0;{il marchez in poz 0,cu semnificatia acesta nu mai exista in heap}
            heap[1]:=heap[l];//il suprascriu cu ultimul element din heap
            dec(l);{scad numarul de elemente din heap}
            poz[heap[1]]:=1;
            if l>1 then
              begin
                unu:=1;
                pop(unu);{corectez minheapul}
              end;
          end
        else
          writeln(g,a[heap[1]]);
    end;
  close(f);
  close(g);
end.