跟poj3667差不多
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 50005;
struct Tree{
int l, r;
int l_len, r_len;
int t_len;
};
Tree tree[MAXN << 2];
int record[MAXN];
int N, M;
void construct(int l, int r, int k) {
tree[k].l = l;
tree[k].r = r;
tree[k].l_len = tree[k].r_len = tree[k].t_len = r - l + 1;
if(l == r) {
return;
}
int mid = l + r >> 1;
construct(l, mid, k << 1);
construct(mid + 1, r, k << 1 | 1);
}
void update(int x, int action, int k) {
if(tree[k].l == tree[k].r) {
tree[k].t_len = tree[k].l_len = tree[k].r_len = action;
return;
}
int mid = tree[k].l + tree[k].r >> 1;
if(x <= mid) {
update(x, action, k << 1);
} else {
update(x, action, k << 1 | 1);
}
tree[k].t_len = max(tree[k << 1].r_len + tree[k << 1 | 1].l_len, max(tree[k << 1].t_len, tree[k << 1 | 1].t_len));
tree[k].l_len = tree[k << 1].l_len == mid - tree[k].l + 1 ? tree[k << 1].l_len + tree[k << 1 | 1].l_len : tree[k << 1].l_len;
tree[k].r_len = tree[k << 1 | 1].r_len == tree[k].r - mid ? tree[k << 1 | 1].r_len + tree[k << 1].r_len : tree[k << 1 | 1].r_len;
}
int query(int x, int k) {
if(tree[k].l == tree[k].r || tree[k].t_len == 0 || tree[k].t_len == tree[k].r - tree[k].l + 1) {
return tree[k].t_len;
}
int mid = tree[k].l + tree[k].r >> 1;
if(x <= mid) {
if(x >= mid - tree[k << 1].r_len + 1) {
return tree[k << 1].r_len + tree[k << 1 | 1].l_len;
} else {
return query(x, k << 1);
}
} else {
if(x <= tree[k << 1 | 1].l_len + mid) {
return tree[k << 1].r_len + tree[k << 1 | 1].l_len;
} else {
return query(x, k << 1 | 1);
}
}
}
int main() {
freopen("poj2892.txt", "r", stdin);
char str[4];
int x, cnt;
while(scanf("%d%d", &N, &M) != EOF) {
cnt = 0;
construct(1, N, 1);
while(M --) {
scanf("%s", str);
if(str[0] == 'D') {
scanf("%d", &x);
record[cnt ++] = x;
update(x, 0, 1);
}
if(str[0] == 'R') {
cnt --;
if(cnt >= 0) {
x = record[cnt];
update(x, 1, 1);
}
}
if(str[0] == 'Q') {
scanf("%d", &x);
printf("%d\n", query(x, 1));
}
}
}
}