#include<cstdio>
#include<algorithm>
#define ls pos<<1
#define rs (pos<<1)+1
#define MID (tree[pos].l+tree[pos].r)>>1
const int MAXN=200000+5;
struct Tree{int l,r,left,right,lv,rv,is,len,ans;};
Tree tree[MAXN*4];int n,q,ask;
void UpReload(int pos)
{
if(tree[ls].is)
{
if(tree[rs].lv!=tree[ls].rv)
{
if(tree[rs].is)
{
tree[pos].is=1;
tree[pos].left=tree[pos].len;
}
else
{
tree[pos].is=0;
tree[pos].left=tree[ls].len+tree[rs].left;
}
}
else
{
if(tree[rs].lv!=tree[ls].rv)
{
tree[pos].left=tree[ls].len+tree[rs].left;
tree[pos].is=0;
}
else
{
tree[pos].is=0;
tree[pos].left=tree[ls].len;
}
}
}
else
{
tree[pos].is=0;
tree[pos].left=tree[ls].left;
}
if(tree[rs].is)
{
if(tree[ls].is)
{
if(tree[ls].rv!=tree[rs].lv)
{
tree[pos].is=1;
tree[pos].right=tree[pos].len;
}
else
{
tree[pos].is=0;
tree[pos].right=tree[rs].len;
}
}
else
{
if(tree[ls].rv!=tree[rs].lv)
{
tree[pos].is=0;
tree[pos].right=tree[rs].len+tree[ls].right;
}
else
{
tree[pos].is=0;
tree[pos].right=tree[rs].len;
}
}
}
else
{
tree[pos].is=0;
tree[pos].right=tree[rs].right;
}
tree[pos].rv=tree[rs].rv;
tree[pos].lv=tree[ls].lv;
int ans1=-1;
if(tree[ls].rv!=tree[rs].lv)
{
ans1=tree[ls].right+tree[rs].left;
}
ans1=std::max(ans1,std::max(std::max(tree[ls].left,tree[ls].right),std::max(tree[rs].left,tree[rs].right)));
tree[pos].ans=std::max(std::max(tree[ls].ans,tree[rs].ans),std::max(std::max(tree[pos].left,tree[pos].right),ans1));
}
void BuildTree(int l,int r,int pos)
{
tree[pos].l=l;tree[pos].r=r;tree[pos].len=r-l+1;
if(l==r)
{
tree[pos].lv=tree[pos].rv=tree[pos].left=tree[pos].right=tree[pos].is=1;
return;
}
int mid=MID;
BuildTree(l,mid,ls);BuildTree(mid+1,r,rs);
UpReload(pos);
}
void Update(int target,int pos)
{
if(tree[pos].l==tree[pos].r)
{
tree[pos].lv=tree[pos].rv=!tree[pos].rv;
return;
}
int mid=MID;
if(target<=mid) Update(target,ls); else Update(target,rs);
UpReload(pos);
}
int main()
{
scanf("%d %d",&n,&q);
BuildTree(1,n,1);
for(int i=1;i<=q;i++)
{
scanf("%d",&ask);
Update(ask,1);
printf("%d\n",tree[1].ans);
}
return 0;
}