按照第一篇题解打的代码
#include <iostream>
#include <cmath>
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int const maxn=1e5+1,maxsqrtn=319;
bool a[maxn];
int block[maxn],sum[maxsqrtn],n,m,f,x,y,len;
void change(int l,int r){
for(int i=l;i<=Min(block[l]*len,r);i++)
a[i]^=1,sum[block[i]]+=(a[i]?1:-1);
if(block[l]!=block[r]){
for(int i=(block[r]-1)*len+1;i<=r;i++)
a[i]^=1,sum[block[i]]+=(a[i]?1:-1);
}
for(int i=block[l]+1;i<block[r];i++)
sum[i]=len-sum[i];
}
int sch(int l,int r){
int s=0;
for(int i=l;i<=Min(block[l]*len,r);i++)
s+=a[i];
if(block[l]!=block[r]){
for(int i=(block[r]-1)*len+1;i<=r;i++)
s+=a[i];
}
for(int i=block[l]+1;i<block[r];i++)
s+=sum[i];
return s;
}
int main(){
scanf("%d%d",&n,&m),len=sqrt(n);
for(int i=1;i<=n;i++) block[i]=ceil(1.0*i/len);
while(m--){
scanf("%d%d%d",&f,&x,&y);
if(f) printf("%d\n",sch(x,y));
else change(x,y);
}
return 0;
}