22 lines
575 B
Text
22 lines
575 B
Text
let lis cmp list =
|
|
let pile_tops = Array.make (List.length list) [] in
|
|
let bsearch_piles x len =
|
|
let rec aux lo hi =
|
|
if lo > hi then
|
|
lo
|
|
else
|
|
let mid = (lo + hi) / 2 in
|
|
if cmp (List.hd pile_tops.(mid)) x < 0 then
|
|
aux (mid+1) hi
|
|
else
|
|
aux lo (mid-1)
|
|
in
|
|
aux 0 (len-1)
|
|
in
|
|
let f len x =
|
|
let i = bsearch_piles x len in
|
|
pile_tops.(i) <- x :: if i = 0 then [] else pile_tops.(i-1);
|
|
if i = len then len+1 else len
|
|
in
|
|
let len = List.fold_left f 0 list in
|
|
List.rev pile_tops.(len-1)
|