代码如下:
#include <bits/stdc++.h>
#define MAX 100010
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll n,m,len;
int light[MAX];
#define loc(x) (x-1)/len+1
typedef struct nodes
{
ll l,r,num,flag;
}Node;
Node N[MAX];
void opt(ll l,ll r)
{
ll x=loc(l),y=loc(r);
if(x==y)
{
for(int i=l;i<=r;i++)
{
light[i]*=-1;
N[x].num+=light[i];
}
return ;
}
for(int i=l;i<=N[x].r;i++)
{
light[i]*=-1;
N[x].num+=light[i]*N[x].flag;
}
for(int i=N[y].l;i<=r;i++)
{
light[i]*=-1;
N[y].num+=light[i]*N[y].flag;
}
for(int i=x+1;i<y;i++)
{
N[i].flag*=-1;
N[i].num=len-N[i].num;
}
}
void query(ll l,ll r)
{
ll x=loc(l),y=loc(r);
ll ans=0,tmp;
if(x==y)
{
tmp=0;
for(int i=l;i<=r;i++)
{
if(light[i]==1) tmp++;
}
if(N[x].flag==-1) ans=(r-l+1)-tmp;
else ans=tmp;
cout<<ans<<endl;
return ;
}
tmp=0;
for(int i=l;i<=N[x].r;i++)
{
if(light[i]==1) tmp++;
}
if(N[x].flag==-1) ans+=(N[x].r-l+1)-tmp;
else ans+=tmp;
tmp=0;
for(int i=N[y].l;i<=r;i++)
{
if(light[i]==1) tmp++;
}
if(N[y].flag==-1) ans+=(r-N[y].l+1)-tmp;
else ans+=tmp;
for(int i=x+1;i<y;i++) ans+=N[i].num;
cout<<ans<<endl;
return ;
}
int main ()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++) light[i]=-1;
len=sqrt(n);
for(int i=1;i<=n/len+1;i++)
{
N[i].l=len*(i-1)+1;
N[i].r=len*i;
N[i].num=0;
N[i].flag=1;
}
int c,a,b;
for(int i=0;i<m;i++)
{
cin>>c>>a>>b;
if(!c) opt(a,b);
else if(c) query(a,b);
}
return 0;
}