let rec solve = function
| (l::ls, [], []) as t -> t::move_next_right (ls, [l], [])
| ([], m::ms, r::rs) as t when r < m -> t::move_next_right ([r], m::ms, rs)
| ([], m::ms, r::rs) as t when m < r -> t::move_next_right ([], ms, m::r::rs)
| (l::ls, [], r::rs) as t when l < r -> t::move_next_right (ls, [l], r::rs)
| (l::ls, [], r::rs) as t when r < l -> t::move_next_right (r::l::ls, [], rs)
| (l::ls, m::ms, []) as t when l < m -> t::move_next_right (ls, l::m::ms, [])
| (l::ls, m::ms, []) as t when m < l -> t::move_next_right (l::ls, ms, [m])
| (l::ls, m::ms, r::rs) as t when l < m && l < r -> t::move_next_right (ls, l::m::ms, r::rs)
| (l::ls, m::ms, r::rs) as t when m < r && m < l -> t::move_next_right (l::ls, ms, m::r::rs)
| (l::ls, m::ms, r::rs) as t when r < l && r < m -> t::move_next_right (r::l::ls, m::ms, rs)
| t -> [t]
and move_next_right = function
| (l::ls, m::ms, []) as t when l > m -> t::solve (ls, m::ms, [l])
| (l::ls, m::ms, []) as t when m > l -> t::solve (l::ls, ms, [m])
| (l::ls, [], r::rs) as t when l > r -> t::solve (ls, [l], r::rs)
| (l::ls, [], r::rs) as t when r > l -> t::solve (l::ls, [r], rs)
| ([], m::ms, r::rs) as t when m > r -> t::solve ([m], ms, r::rs)
| ([], m::ms, r::rs) as t when r > m -> t::solve ([r], m::ms, rs)
| (l::ls, m::ms, r::rs) as t when l > m && l < r -> t::solve (ls, m::ms, l::r::rs)
| (l::ls, m::ms, r::rs) as t when l > r && l < m -> t::solve (ls, l::m::ms, r::rs)
| (l::ls, m::ms, r::rs) as t when m > r && m < l -> t::solve (m::l::ls, ms, r::rs)
| (l::ls, m::ms, r::rs) as t when m > l && m < r -> t::solve (l::ls, ms, m::r::rs)
| (l::ls, m::ms, r::rs) as t when r > l && r < m -> t::solve (l::ls, r::m::ms, rs)
| (l::ls, m::ms, r::rs) as t when r > m && r < l -> t::solve (r::l::ls, m::ms, rs)
| t -> [t]