Ускорить процесс добавления, удаления элементов, поиска k-го максимума в векторе

Есть простая задачка. Можно добавлять элемент в вектор, удалять, искать k-тый максимум. Написал решение, но оно не проходит по времени. Полное условие здесь: https://www.e-olymp.com/ru/problems/687

#include <vector>
#include <algorithm>
#include <stdio.h>

using namespace std;

int main()
{
    int n, a, N, index;
    bool sort_block = 0, bin_search = 0;
    vector<int> vec;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d", &a, &N);
        if (a==1)
        {
            sort_block = 0;
            bin_search = 0;
            vec.push_back(N);
        }
        else if (a == -1)
        {
            int j = 0;
            if (bin_search == 0)
            {
                auto f = find(vec.begin(), vec.end(), N);
                vec.erase(f);
            }
            else
            {
                auto f = lower_bound(vec.begin(), vec.end(), N);
                vec.erase(f);
            }
        }
        else
        {
            if (sort_block == 0)
            {
                sort(vec.begin(), vec.end());
                sort_block = 1;
                bin_search = 1;
            }
            printf("%d\n", vec[vec.size() - N]);
        }
    }
}

Ответы (1 шт):

Автор решения: MBo

Ну наверное, изначально понятно, да и по условию задано, что примитивная структура данных тут никак не подойдёт.

А подойдёт сбалансированное дерево поиска - RB или AVL, узлы которого дополнены информацией о порядковом номере элемента в текущем наборе. Все операции выполняются за логарифмическое время.

Почитать можно, например, в Кормене (augmented search trees)

→ Ссылка