解题思路:
建立线段树,维护线段树每个区间的从左开始最大序列、从右开始最大序列、最大序列
#include<bits/stdc++.h>
using namespace std;
const int maxn=20010;
int lsum[maxn<<2],rsum[maxn<<2],peo[maxn],sum[maxn<<2];
void build(int p,int l,int r)
{
lsum[p]=rsum[p]=sum[p]=1;
if(l==r) return;
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
void update(int p,int l,int r)
{
int mid=(l+r)>>1;
lsum[p]=lsum[p<<1];
rsum[p]=rsum[p<<1|1];
sum[p]=max(sum[p<<1],sum[p<<1|1]);
if(peo[mid]!=peo[mid+1])
{
sum[p]=max(sum[p],rsum[p<<1]+lsum[p<<1|1]);
if(lsum[p<<1]==mid-l+1) lsum[p]+=lsum[p<<1|1];
if(rsum[p<<1|1]==r-mid) rsum[p]+=rsum[p<<1];
}
}
void change(int p,int l,int r,int k)
{
if(l==r)
{
peo[l]=!peo[l];
return;
}
int mid=(l+r)>>1;
if(k<=mid) change(p<<1,l,mid,k);
else change(p<<1|1,mid+1,r,k);
update(p,l,r);
}
int main()
{
int n,m;
cin>>n>>m;
build(1,1,n);
while(m--)
{
int temp;
cin>>temp;
change(1,1,n,temp);
cout<<sum[1]<<endl;
}
return 0;
}