代码如下
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lc 2*k
#define rc 2*k+1
//#define mid (l+r)/2
const int maxn=1e5+10;
int tre[maxn*4],laz[maxn*4],tmp[maxn];
//void b_tre(int k,int l,int r)
//{
// if(l>=r)
// {
// tre[k]=tmp[r];
// return ;
// }
// int mid=(l+r)/2;
// b_tre(lc,l,mid);
// b_tre(rc,mid+1,r);
// tre[k]=tre[lc]+tre[rc];
// return ;
//}
void laz_d(int k,int l,int r) {
if(laz[k]) {
tre[k]=(r-l+1-tre[k]);
if(l!=r) {
laz[lc]^=1;
laz[rc]^=1;
}
laz[k]=0;
}
return ;
}
void ans_u(int k,int l,int r) {
int mid=(l+r)/2;
laz_d(lc,l,mid);
laz_d(rc,mid+1,r);
tre[k]=tre[lc]+tre[rc];
return ;
}
void change(int k,int l,int r,int al,int ar) {
if(al<=l&&ar>=r) {
laz[k]^=1;
return ;
}
laz_d(k,l,r);
int mid=(l+r)/2;
if(ar>mid)
change(rc,mid+1,r,al,ar);
if(al<=mid)
change(lc,l,mid,al,ar);
ans_u(k,l,r);
}
int get(int k,int l,int r,int al,int ar) {
if(al<=l&&ar>=r) {
if(laz[k]) {
tre[k]=(r-l+1-tre[k]);
laz[k]=0;
}
return tre[k];
}
if(laz[k])laz_d(k,l,r);
int mid=(r+l)/2,sum=0;
if(al<=mid)
sum+=get(lc,l,mid,al,ar);
if(ar>mid)
sum+=get(rc,mid+1,r,al,ar);
return sum;
}
signed main() {
int n,m;
cin>>n>>m;
// b_tre(1,1,n);
memset(laz,0,sizeof(laz));
int k,l,r,o;
for(int i=1; i<=m; i++) {
cin>>o>>l>>r;
if(o==0) {
change(1,1,n,l,r);
} else if(o==1) {
cout<<get(1,1,n,l,r)<<"\n";
}
}
return 0;
}