You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.1 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int N = 20010;
// 线段树
#define mid ((l + r) >> 1)
#define ls (u << 1)
#define rs (u << 1 | 1)
struct Node {
int l, r, len;
int lx, rx, mx; // lx:左起最长符合条件的长度rx:右起最长符合条件的长度mx:整体区间内符合条件的长度
} tr[N << 2];
int color[N]; // 每个位置上的颜色
void pushup(int u) {
// 左儿子的最右端点颜色,与右儿子的最左端点颜色是否相同
bool flag = color[tr[ls].r] != color[tr[rs].l];
tr[u].lx = tr[ls].lx; // 左起最长,继承左儿子的左起最长
// 如果左儿子全部区间满足条件,并且,左儿子最右,不等于,右儿子最左,也就是继续符合条件
if ((tr[ls].lx == tr[ls].len) && flag) tr[u].lx = tr[ls].len + tr[rs].lx;
tr[u].rx = tr[rs].rx; // 右起最长,继承右儿子的右起最长
// 如果右儿子全部区间满足条件,并且,右儿子最左,不等于,左儿子最右,也就是继续符合条件
if ((tr[rs].rx == tr[rs].len) && flag) tr[u].rx = tr[rs].len + tr[ls].rx;
tr[u].mx = max(tr[ls].mx, tr[rs].mx);
if (flag) tr[u].mx = max(tr[u].mx, tr[ls].rx + tr[rs].lx); // 拼接
}
void build(int u, int l, int r) {
tr[u].l = l, tr[u].r = r, tr[u].len = r - l + 1;
if (l == r) {
tr[u].lx = tr[u].rx = tr[u].mx = 1; // 表演刚开始每一个鼓都是红色面朝向观众
return;
}
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(u);
}
void modify(int u, int p) {
int l = tr[u].l, r = tr[u].r;
if (l == r) {
color[p] = !color[p]; // 红变白,白变红
return;
}
if (p <= mid)
modify(ls, p);
else
modify(rs, p);
pushup(u);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("P2253.in", "r", stdin);
#endif
int n, m;
cin >> n >> m;
build(1, 1, n);
while (m--) {
int p;
cin >> p;
modify(1, p);
printf("%d\n", tr[1].mx);
}
return 0;
}