Здравствуйте.
Подскажите, пожалуйста, какую структуру данных нужно использовать для того, чтобы последовательное выполнение
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
команд вставки и удаления половины элементов с наибольшими ключами производилось за
![$O(n)$ $O(n)$](https://dxdy-02.korotkov.co.uk/f/1/f/0/1f08ccc9cd7309ba1e756c3d9345ad9f82.png)
времени. Предполагается, что структура изначально пустая.
Понятно, что если 2-ую операцию реализовать за время
![$O(n)$ $O(n)$](https://dxdy-02.korotkov.co.uk/f/1/f/0/1f08ccc9cd7309ba1e756c3d9345ad9f82.png)
, то условие будет выполнено.
Даже ясна одна из реализаций: нужно удалить - считаешь медиану (такой элемент, что в упорядоченном множестве находился бы посередине(или один из элементов, если их несколько) множества и разбиваешь на 2 половинки: больше её и меньше, большую удаляешь. Для нахождения медианы есть детерминированный алгоритм, работающий за
![$O(n)$ $O(n)$](https://dxdy-02.korotkov.co.uk/f/1/f/0/1f08ccc9cd7309ba1e756c3d9345ad9f82.png)
, а для второго достачно и вовсе одного пробега по массиву. Т.е. условие выполнено.
Но проблема в том, что для нахождения медианы хоть и требуется линейное время, но коэффицент очень велик, поэтому поступать так не очень хорошо, и, скорее всего, есть другое решение. Подскажите, пожалуйста.
Спасибо.
p.s. задача из книги Кормен "Алгоритмы, построение и анализ".