В основном:
Массив с бинарным поиском удовлетворяет моему второму требованию, но он все еще слишком медленный для вставки. Какое решение может работать лучше всего?
Красно-черные деревья и пропускают списки удовлетворяют ваши требования, среди прочего. Для примера в C ++ посмотрите std :: set, std :: map и т. Д. И их методы lower_ / upper_bound и equal_range.
Двоичное дерево поиска.
Многие варианты дерева поиска соответствуют вашим требованиям.Я бы использовал 2-3 дерева или, может быть, трепу, если бы мне было лень.