rt,找出细小或大错误请 at。
# include <bits/stdc++.h>
# define int long long
# define up(i ,x, y) for (int i = x ; i <= y; i ++)
using namespace std;
inline int read (){int s = 0 ; bool w = 0 ; char c = getchar () ; while (!isdigit (c)) {w |= (c == '-') ,c = getchar () ;} while (isdigit (c)){s = (s << 1) + (s << 3) + (c ^ 48) ; c = getchar ();}return w ? -s : s;}
inline void write (int x){if (x < 0) putchar ('-') ,x = -x; if (x > 9) write (x / 10) ; putchar (x % 10 | 48);}
inline void writesp (int x){write (x) ,putchar (' ');}
inline void writeln (int x){write (x) ,putchar ('\n');}
//L : 0 ; R : 1.
const int N = 2e5 + 10;
struct SGT {int l ,r ,lmx ,rmx ,mx;} tr[N << 2];
int n ,Q ,a[N];
inline void pushup (int u){
int mid = tr[u << 1].r ,lft = mid + 1;
if (tr[u << 1].lmx == mid - tr[u << 1].l + 1) tr[u].lmx = tr[u << 1].lmx + (a[mid] != a[lft]) * tr[u << 1 | 1].lmx;
else tr[u].lmx = tr[u << 1].lmx;
if (tr[u << 1 | 1].rmx = tr[u << 1 | 1].r - mid) tr[u].rmx = tr[u << 1 | 1].rmx + (a[lft] != a[mid]) * tr[u << 1].rmx;
else tr[u].rmx = tr[u << 1 | 1].rmx;
//tr[u].mx = max (tr[u].lmx ,tr[u].rmx);
tr[u].mx = max (tr[u << 1].mx ,max (tr[u << 1 | 1].mx ,(a[mid] != a[lft]) * (tr[u << 1].rmx + tr[u << 1 | 1].lmx)));
} inline void build (int u ,int l ,int r){
tr[u].l = l ,tr[u].r = r;
if (l == r) { tr[u].mx = tr[u].lmx = tr[u].rmx = 1 ; return ;}
int mid = ((l + r) >> 1);
build (u << 1 ,l ,mid);
build (u << 1 | 1 ,mid + 1 ,r);
pushup (u);
} inline void modify (int u ,int x){
int l = tr[u].l ,r = tr[u].r;
if (l == r && l == x) return ;
int mid = ((l + r) >> 1);
if (x <= mid) modify (u << 1, x);
else modify (u << 1 | 1 ,x);
pushup (u);
} signed main (){
n = read () ,Q = read ();
// up (i ,1, n) a[i] = 0;
build (1 ,1 ,n);
while (Q --){
int x = read ();
a[x] = !a[x];
modify (1 ,x);
writeln (tr[1].mx);
}
return 0;
}