平衡树维护被毁坏的房子就好了
set可以水过。。。注意边界问题
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <stack>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 50000 + 10;
typedef long long ll;
int n,m,a[MAXN],last,vis[MAXN];
set<int> s;
set<int> :: iterator it;
stack<int> sta;
int main() {
scanf("%d%d", &n, &m);
char cmd[5];
for(int i=1; i<=m; i++) {
int x;
scanf("%s", cmd);
if(cmd[0] == 'D') {
scanf("%d", &x);
sta.push(x);
vis[x] = 1;
s.insert(x);
} else if(cmd[0] == 'R') {
vis[sta.top()] = 0;
s.erase(sta.top());
sta.pop();
} else if(cmd[0] == 'Q') {
scanf("%d", &x);
it = s.upper_bound(x);
if(vis[x]) {
printf("0\n");
continue;
}
int l = 1, r = n;
if(it != s.end()) {
r = *it;
r--;
}
it = s.lower_bound(x);
if(it != s.begin()) {
it--;
l = *it;
l++;
}
int ans = r - l + 1;
printf("%d\n", ans);
}
}
return 0;
}