fill rebuilt the array as array[:start] + fill + array[end:]. When start
came after end those two slices overlapped, duplicating the shared
elements and growing the array while writing no value. Normalize start and
end into [0, length] and fill in place with an index loop so an empty span
is a no-op and the length stays fixed.
sorted_last_index returns 0 for an empty array (and for any value smaller
than every element), so index becomes -1. The guard only bounded index
from above, so array[-1] was evaluated on an empty list and raised
IndexError. Add the lower-bound check so a negative index is reported as
not found, matching sorted_index_of.