xgw120121 @ 2024-07-07 13:30:43
#include<bits/stdc++.h>
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
int n,m,opt,x,y;
int a[100010];
struct node
{
int sum,lazy,rev;
int ans[5],l[5],r[5];
}t[100010<<2];
void pushup(int id,int l,int r)
{
int mid=l+r>>1;
t[id].sum=t[ls].sum+t[rs].sum;
for(int i=0;i<=1;i++)
{
t[id].l[i]=t[ls].l[i];t[id].r[i]=t[rs].r[i];
if(i==1&&t[ls].sum==mid-l+1) t[id].l[i]+=t[rs].l[i];
if(i==0&&t[ls].sum==0) t[id].l[i]+=t[rs].l[i];
if(i==1&&t[rs].sum==r-mid) t[id].r[i]+=t[ls].r[i];
if(i==0&&t[rs].sum==0) t[id].r[i]+=t[ls].r[i];
t[id].ans[i]=max(t[ls].ans[i],t[rs].ans[i]);
t[id].ans[i]=max(t[id].ans[i],t[ls].r[i]+t[rs].l[i]);
}
}
void pushdown(int id,int l,int r)
{
int mid=l+r>>1;
if(t[id].lazy!=-1)
{
t[id].rev=0;
int tag=t[id].lazy;
t[ls].sum=(mid-l+1)*tag;
t[rs].sum=(r-mid)*tag;
t[ls].lazy=t[rs].lazy=tag;
t[ls].rev=t[rs].rev=0;
t[ls].ans[tag]=t[ls].l[tag]=t[ls].r[tag]=(mid-l+1);
t[rs].ans[tag]=t[rs].l[tag]=t[rs].r[tag]=(r-mid);
tag^=1;
t[ls].ans[tag]=t[ls].l[tag]=t[ls].r[tag]=0;
t[rs].ans[tag]=t[rs].l[tag]=t[rs].r[tag]=0;
tag^=1;
t[id].lazy=-1;
}
if(t[id].rev)
{
t[ls].sum=mid-l+r-t[ls].sum;
t[rs].sum=r-mid-t[rs].sum;
if(t[ls].lazy!=-1) t[ls].lazy^=1;
if(t[rs].lazy!=-1) t[rs].lazy^=1;
swap(t[ls].ans[0],t[ls].ans[1]);
swap(t[ls].l[0],t[ls].l[1]);
swap(t[ls].r[0],t[ls].r[1]);
swap(t[rs].ans[0],t[rs].ans[1]);
swap(t[rs].l[0],t[rs].l[1]);
swap(t[rs].r[0],t[rs].r[1]);
t[id].rev=0;
}
}
void build(int id,int l,int r)
{
t[id].lazy=-1;
if(l==r)
{
cin>>a[l];
t[id].sum=(a[l]==1);
t[id].ans[0]=t[id].l[0]=t[id].r[0]=(a[l]==0);
t[id].ans[1]=t[id].l[1]=t[id].r[1]=(a[l]==1);
return;
}
int mid=l+r>>1;
build(ls,l,mid);build(rs,mid+1,r);
pushup(id,l,r);
}
void update(int id,int l,int r)
{
pushdown(id,l,r);
if(x<=l&&r<=y)
{
if(opt<=1)
{
t[id].sum=(r-l+1)*opt;
t[id].lazy=opt;
t[id].ans[0]=t[id].l[0]=t[id].r[0]=(r-l+1)*(opt==0);
t[id].ans[1]=t[id].l[1]=t[id].r[1]=(r-l+1)*(opt==1);
}
else
{
t[id].sum=(r-l+1)-t[id].sum;
t[id].rev^=1;
swap(t[id].ans[0],t[id].ans[1]);swap(t[id].l[0],t[id].l[1]);swap(t[id].r[0],t[id].r[1]);
}
return;
}
int mid=l+r>>1;
if(x<=mid) update(ls,l,mid);
if(mid+1<=y) update(rs,mid+1,r);
pushup(id,l,r);
}
int query_sum(int id,int l,int r)
{
pushdown(id,l,r);
if(x<=l&&r<=y) return t[id].sum;
int mid=l+r>>1,ans=0;
if(x<=mid) ans+=query_sum(ls,l,mid);
if(mid+1<=y) ans+=query_sum(rs,mid+1,r);
// pushup(id,l,r);
return ans;
}
node query_tree(int id,int l,int r)
{
pushdown(id,l,r);
if(x<=l&&r<=y) return t[id];
int mid=l+r>>1;
if(y<=mid) return query_tree(ls,l,mid);
else if(mid+1<=x) return query_tree(rs,mid+1,r);
else
{
node tree,lt=query_tree(ls,l,mid),rt=query_tree(rs,mid+1,r);
for(int i=0;i<=1;i++)
{
tree.l[i]=lt.l[i];tree.r[i]=rt.r[i];
if(i==1&<.sum==mid-l+1) tree.l[i]+=rt.l[i];
if(i==0&<.sum==0) tree.l[i]+=rt.l[i];
if(i==1&&rt.sum==r-mid) tree.r[i]+=lt.r[i];
if(i==0&&rt.sum==0) tree.r[i]+=lt.r[i];
tree.ans[i]=max(lt.ans[i],rt.ans[i]);
tree.ans[i]=max(tree.ans[i],lt.r[i]+rt.l[i]);
}
return tree;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
build(1,1,n);
while(m--)
{
cin>>opt>>x>>y;
if(opt<=2) update(1,1,n);
else if(opt==3) cout<<query_sum(1,1,n)<<'\n';
else cout<<query_tree(1,1,n).ans[1]<<'\n';
}
}
by xgw120121 @ 2024-07-07 13:31:05
@xgw120121 拜托了