思路

因为每次查询都是找不在集合S中的数,所以不妨逆向思维建立一个集合K,集合K为不在集合S中的所有元素

想到这里如果直接把不在S中的集合全部加到K中那初始时就要加入 1 ~ 1e10 共1e10个元素,那肯定是会超时的

观察一下,每次查找都是找最小的大于x的数并且不在集合S中的,那就是在集合K中的大于元素X的,我们可以离线预处理,先把所有插入删除查找的元素X和X+1都插入集合K,其他的元素在这个数据中无关,就不用都插入到集合K中,查找用二分查找lower_bound就好

代码

#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#pragma GCC optimize(3)
typedef long long ll;
#define INF 0x3f3f3f3f
const int mod = 1e9+7;
const int maxn = 1e5+5;
#define stop system("pause")
inline ll read(){
    ll s = 0, w = 1; char ch = getchar();
    while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}
set<int> s;
int op[1000005],x[1000005];
int main(){
    int n = read();
    for(int i = 0 ; i < n ; ++i){
        op[i] = read();x[i] = read();
        s.insert(x[i]);
        s.insert(x[i] + 1);
    }
    for(int i = 0 ; i < n ; ++i){
        if(op[i] == 1) s.erase(x[i]);
        else if(op[i] == 2) s.insert(x[i]);
        else{
            auto it = s.lower_bound(x[i]);
            printf("%d\n",*it);
        }
    }
    return 0;
}

私货:比赛的时候没注意给的时间,想了一下只会一种做法不过肯定会超时就溜了,赛后队友才发现这题给了5s