Pagini recente » Cod sursa (job #1795022) | Cod sursa (job #1802781) | Cod sursa (job #2538903) | Cod sursa (job #3146349) | Cod sursa (job #1637926)
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.