代码如下:
#include<iostream>
using namespace std;
int n,m,sum[400005],add[400004];
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[(rt<<1)+1];
}
void pushdown(int rt,int len)
{
if(add[rt])
{
sum[rt<<1]=(len+1>>1)-sum[rt<<1],
sum[(rt<<1)+1]=(len>>1)-sum[(rt<<1)+1],
add[rt<<1]=add[(rt<<1)+1]=1;
add[rt]=0;
}
}
void update(int ul,int ur,int l,int r,int rt)
{
if(ul<=l&&ur>=r)
{
sum[rt]=r-l+1-sum[rt];
add[rt]=1;
return ;
}
int mid=l+r>>1;
pushdown(rt,r-l+1);
if(ul<=mid)
update(ul,ur,l,mid,rt<<1);
if(ur>mid)
update(ul,ur,mid+1,r,(rt<<1)+1);
pushup(rt);
}
int query(int ql,int qr,int l,int r,int rt)
{
if(ql<=l&&qr>=r)
{
return sum[rt];
}
int mid=l+r>>1,ret=0;
pushdown(rt,r-l+1);
if(ql<=mid)
ret+=query(ql,qr,l,mid,rt<<1);
if(qr>mid)
ret+=query(ql,qr,mid+1,r,(rt<<1)+1);
return ret;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int c,a,b;
cin>>c>>a>>b;
if(c==0)
update(a,b,1,n,1);
if(c==1)
cout<<query(a,b,1,n,1)<<'\n';
}
return 0;
}