#include<bits/stdc++.h>
using namespace std;
int n,m,s[100010];
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin>>n>>m;
for(register int i=1;i<=m;i++){
register int a,b,c,ans=0;
cin>>a>>b>>c;
if(!a){
for(int i=b;i<=c;i++)
s[i]^=1;
}
else {
for(int i=b;i<=c;i++)
ans+=s[i];
cout<<ans<<"\n";
}
}
return 0;
}
暴力
#include<bits/stdc++.h>
using namespace std;
const int N = 500010;
int n,m,c,a,b,v[N],tag[N];
void pushup(int pos){
v[pos]=v[pos<<1]+v[pos<<1|1];
}
void pushdown(int pos,int l,int r){
int mid=(l+r)>>1;
tag[pos<<1]^=(tag[pos]&1);
if(tag[pos]&1) v[pos<<1]=(mid-l+1-v[pos<<1]);
tag[pos<<1|1]^=(tag[pos]&1);
if(tag[pos]&1) v[pos<<1|1]=(r-mid-v[pos<<1|1]);
tag[pos]=0;
}
void Xor(int pos,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r){
v[pos]=(r-l+1-v[pos]);
tag[pos]^=1;
return;
}
pushdown(pos,l,r);
int mid=(l+r)>>1;
if(ql<=mid) Xor(pos<<1,l,mid,ql,qr);
if(qr>mid) Xor(pos<<1|1,mid+1,r,ql,qr);
pushup(pos);
}
int Sum(int pos,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return v[pos];
pushdown(pos,l,r);
int ans=0,mid=(l+r)>>1;
if(ql<=mid) ans+=Sum(pos<<1,l,mid,ql,qr);
if(qr>mid) ans+=Sum(pos<<1|1,mid+1,r,ql,qr);
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>c>>a>>b;
if(c){
cout<<Sum(1,1,n,a,b)<<"\n";
}
else Xor(1,1,n,a,b);
}
return 0;
}
线段树