One if before the merge.
Move the runs and watch it pay.
Plain top-down mergesort, plus a single test: after sorting both halves, merge only when
A[m-1] > A[m]. A call whose whole range sits inside one run fails that test and
pays nothing. This is not the run-adaptive framework — there is no run
decomposition and no merge tree over runs, just the fixed dyadic recursion with some of its
merges switched off. Drag the run strip at the bottom of the tree; everything above it is
rebuilt on every change.
drag a boundary to resize two runs · drag a run past its neighbour to swap · click to select · ←→ select ↑↓ resize (shift ×10) s split j join d duplicate x delete ,. swap u undo space play f present
Throw run profiles at it.
See what breaks.
Searching compositions is exhaustive over inputs: for a fixed run-length profile the reverse-ordered construction attains the maximum cost of any array with that profile, so nothing is missed by only moving run boundaries. Push (cost − nH)/n, HS − H or the excess average depth and see whether any of them gets past 3. Ticking a conjecture turns the search into a counterexample hunt.
drag a boundary to resize · drag a run past its neighbour to swap · ←→ select ↑↓ resize u undo