P6492 [COCI2010-2011#6] STEP - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#pragma GCC optimize(3,"Ofast","inline")
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
//typedef __int128 LL;//2的128
typedef long long ll; //2的64
// 1e9,, 1e19,,1e38
#define int long long
int n,q;
const int N=200010;
int a[N];
struct node{
int l,r,sum,lsum,rsum;
//左区间最大值,右区间最大值
//区间标记
/*
a[l]!=a[r]
那么 就可以找l右边+r的左边
*/
}tr[N*4];
void pushup(int u,int l,int r){
int mid=(l+r)/2;
tr[u].sum=max(tr[u*2].sum,tr[u*2+1].sum);
tr[u].lsum=tr[u*2].lsum;
tr[u].rsum=tr[u*2+1].rsum;
if(a[mid]!=a[mid+1]){
tr[u].sum=max(tr[u].sum,tr[u*2].rsum+tr[u*2+1].lsum);
if(tr[u].lsum==(mid-l+1)){
tr[u].lsum=tr[u].lsum+tr[u*2+1].lsum;
}
if(tr[u].rsum==(r-(mid+1)+1)){
tr[u].rsum=tr[u*2].rsum+tr[u].rsum;
}
return;
}
}
void build(int u,int l,int r){
tr[u]={l,r};
if(l==r){
tr[u].sum=1,tr[u].lsum=1;
tr[u].rsum=1;
a[l]=0;
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u,l,r);
}
void change(int u,int l,int r,int k){
if(l==k&&r==k){
a[l]^=1;//找到根节点修改即可
return;
}
int mid=(l+r)/2;
if(mid>=k) change(u*2,l,mid,k);
else change(u*2+1,mid+1,r,k);
pushup(u,l,r);
}
void solve()
{
cin>>n>>q;
build(1,1,n);
while(q--){
int k;cin>>k;
change(1,1,n,k);
cout<<tr[1].sum<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
solve();
return 0;
}