description:

对于文档有两个操作
1.新建 编号取当前最小的没有用过的值 从1开始计算
2.删除 删除对应编号
询问每次新建的编号

solution:

容易想到先用bool来表示当前编号是否使用 但是正向维护当前已经使用的编号查询最小未使用的编号有些困难
用一个优先队列或者set来维护被删除过的编号 这样可以O(1)得到答案 满足题目复杂度

code:

#include <bits/stdc++.h>

using namespace std;

set <int> s;

bool vis[100005];

int main(){
    ios::sync_with_stdio(0);

    int n ;cin >> n;

    int cnt = 0;
    string op;

    while(n --){
        cin >> op;

        if(op [0] == 'N'){
            if(s.empty()){
                cout << ++ cnt ;
               vis[cnt] = 1;
            }else{
                auto it = s.begin();
                cout << *it ;
                vis[*it] = 1;
                s.erase(it);
            }
        }else{
            int x;cin >> x;
            if(vis[x]){
                vis[x] = 0;
                s.insert(x);
                cout << "Successful";
            }else{
                cout << "Failed";
            }
        }
        cout << '\n';
    }

    return 0;
}