(* ksuurin.p *)
program ksuurin;
import TRA;

(* ELEMENT on liukuluku *)

function element_prio(x : ELEMENT) : real;
begin
	element_prio := ELEMENT_FLOAT(x);
end;

	
function kmax(L : LIST; k : integer) : ELEMENT;
	var P : PRIQUEUE;
		i : integer;
		a : LIST_POSITION;
		x : ELEMENT;
begin
	i := 0;
	PRIQUEUE_CREATE(P, LIST_TYPE(L));
	a := LIST_FIRST(L);

	while (a <> LIST_EOL(L)) do begin

		x := LIST_RETRIEVE(L, a);
		PRIQUEUE_INSERT(P, x, element_prio(x));
		i := i + 1;
		a := LIST_NEXT(L, a);
		if (i > k) then
			PRIQUEUE_DELETEMIN(P);
	end;

	x := PRIQUEUE_MIN(P);
	PRIQUEUE_FREE(P);
	kmax := x;
end;
	

(* kokeiluosio *)

const N  = 10;

var l  : LIST;
	i : integer;
	x : real;

begin

  FLOAT_LIST_CREATE(l);

  for i := 1 to N do
	  FLOAT_LIST_INSERT(l, LIST_EOL(l), tra_random(100) / 10.0 );

  writeln('Lista:');
  LIST_PRINT(l); writeln;

  for i := 1 to N do
  	writeln(i, ':nneksi suurin alkio :', ELEMENT_FLOAT(kmax(l, i)):4:2);

  LIST_FREE(l);

end.

