Scanf.scanf "%d" (fun n -> let pos = Array.make (n + 1) 0 in let module S = Set.Make (struct type t = int * int let compare = compare end) in let rec loop i set = if i = n then set else loop (i + 1) (Scanf.scanf " %d" (fun v -> pos.(v) <- i; S.add (i, v) set)) in let set = loop 0 S.empty in let rec loop rest mi q set = if rest = 0 then List.rev q else if pos.(mi) < 0 then loop rest (mi + 1) q set else let p = pos.(mi) in let _, _, r = S.split (p, mi - 1) set in let c0, v0 = S.min_elt r in let r = S.remove (c0, v0) r in if S.is_empty r then loop rest (mi + 1) q set else let c1, v1 = S.min_elt r in let set = S.remove (c0, v0) set in let set = S.remove (c1, v1) set in let () = pos.(v0) <- -1 in let () = pos.(v1) <- -1 in loop (rest - 2) mi (v1 :: v0 :: q) set in let q = loop n 1 [] set in List.iter (Printf.printf "%d ") q; print_newline () )