/* * 这个题目跟hotel差不多的,可以说是一样的。好就没有用vector了,陌生了 * 更新节点,询问节点所在的位置有多少连续的区间 */ #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> #include <stack> #define LL(x) ((x) << 1) #define RR(x) ((x) << 1 | 1) using namespace std; const int N = 50005; struct Seg_tree { int l, r; int r_size, size, l_size; int mid() { return (l + r) >> 1; } int dis() { return (r - l + 1); } void doit(int st) { if (st == 0) // 0表示修复 r_size = size = l_size = dis(); else r_size = size = l_size = 0; } } tree[N * 4]; //现在觉得开4倍比较保险 vector<int> df; inline void Build(int l, int r, int node) { tree[node].l = l; tree[node].r = r; tree[node].l_size = tree[node].size = tree[node].r_size = tree[node].dis(); if (l == r) { return; } int mid = (l + r) >> 1; Build(l, mid, LL(node)); Build(mid + 1, r, RR(node)); } inline void Update(int node, int dx, int st) { if (tree[node].l == tree[node].r) { tree[node].doit(st); return; } int mid = tree[node].mid(); if (dx <= mid) Update(LL(node), dx, st); else Update(RR(node), dx, st); tree[node].size = max(tree[LL(node)].r_size + tree[RR(node)].l_size, max( tree[LL(node)].size, tree[RR(node)].size)); tree[node].l_size = tree[LL(node)].l_size ;//+ tree[RR(node)].l_size; // 因为@那里的原因自己修改了这个错误,但是一直不对 tree[node].r_size = tree[RR(node)].r_size ;//+ tree[LL(node)].r_size; // 手调的时候才会才发现,没有进入R的那句语句,太菜了 if (tree[LL(node)].size == tree[LL(node)].dis()) { tree[node].l_size += tree[RR(node)].l_size; } if (tree[RR(node)].size == tree[RR(node)].dis()) { tree[node].r_size += tree[LL(node)].r_size; }if (dx <= mid) { if (dx > tree[LL(node)].r - tree[LL(node)].r_size) { return Query(LL(node), dx) + Query(RR(node), tree[RR(node)].l); } else { return Query(LL(node), dx); } } else { if (dx < tree[RR(node)].l + tree[RR(node)].l_size) { return Query(RR(node), dx) + Query(LL(node), tree[LL(node)].r); } else { return Query(RR(node), dx); } } } inline int Query(int node, int dx) { if (tree[node].l == tree[node].r || tree[node].size == 0 || tree[node].size == tree[node].dis()) { return tree[node].size; } int mid = tree[node].mid(); if (dx <= mid) { if (dx > tree[LL(node)].r - tree[LL(node)].r_size) { return Query(LL(node), dx) + Query(RR(node), tree[RR(node)].l); } else { return Query(LL(node), dx); } } else {if (dx <= mid) { if (dx > tree[LL(node)].r - tree[LL(node)].r_size) { return Query(LL(node), dx) + Query(RR(node), tree[RR(node)].l); } else { return Query(LL(node), dx); } } else { if (dx < tree[RR(node)].l + tree[RR(node)].l_size) { return Query(RR(node), dx) + Query(LL(node), tree[LL(node)].r); } else { return Query(RR(node), dx); } } if (dx < tree[RR(node)].l + tree[RR(node)].l_size) { return Query(RR(node), dx) + Query(LL(node), tree[LL(node)].r); } else { return Query(RR(node), dx); } } } int main() { int n, m; while (scanf("%d %d", &n, &m) != EOF) { Build(1, n, 1); char str[2]; int a; df.clear(); while (m--) { scanf("%s", str); if (str[0] == 'D') { scanf("%d", &a); df.push_back(a); Update(1, a, 1); } else if (str[0] == 'R') { //if (df.empty()) // @这句话不加也是AC的, 搞了半天原来就是这里弄错了,vector为空的时候返回的真的 //continue; int b = df.back(); df.pop_back(); Update(1, b, 0); } else { scanf("%d", &a); int ans = Query(1, a); printf("%d/n", ans); } } } return 0; }