16分求调
查看原帖
16分求调
528853
zh1221_qwq楼主2023/6/28 16:09
#include<iostream>
using namespace std;
const int N=2e5+5;
int n,m,l[N*4],r[N*4],ans[N*4],len[N*4],s[N*4],e[N*4];//l左端点,r右,s左边开始最长,e右边结束最长 
void pushup(int u){
	int lx=2*u,rx=2*u+1;
	if(r[lx]!=l[rx]){
		ans[u]=max(ans[u],e[lx]+s[rx]);
		ans[u]=max(ans[u],max(ans[lx],ans[rx]));
		if(s[lx]==len[lx])s[u]=max(s[u],s[lx]+s[rx]);
		if(e[rx]==e[rx])e[u]=max(e[u],e[lx]+e[rx]);
	}
	else ans[u]=max(ans[u],max(ans[lx],ans[rx]));
	l[u]=l[lx];
	r[u]=r[rx];
	s[u]=max(s[u],s[lx]);
	e[u]=max(e[u],e[rx]);
	
}
void kkk(int u,int k){
	ans[u]=s[u]=e[u]=1;
	l[u]=r[u]=k;
}
void ch(int u,int lx,int rx,int x){
	if(lx==rx){
		kkk(u,l[u]^1);
		return;
	}
	int mid=(lx+rx)/2;
	if(x<=mid)ch(u*2,lx,mid,x);
	else ch(u*2+1,mid+1,rx,x);
	pushup(u);
}
void build(int lx,int rx,int u){
	int mid=(lx+rx)/2;
	len[u]=rx-lx+1;
	if(lx==rx){
		kkk(u,0);
		return;
	}
	build(lx,mid,2*u);
	build(mid+1,rx,2*u+1);
	pushup(u);
}
int main(){
	cin>>n>>m;
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int x;
		cin>>x;
		ch(1,1,n,x);
		cout<<ans[1]<<endl;
	}
}
2023/6/28 16:09
加载中...