#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
#define int long long
int n,m,lz[N*4],w[N*4],opt,x,y;
void pushup(int u){
w[u]=w[u*2]+w[u*2+1];
}
//void build(int u,int l,int r){
// if(l==r){
// w[u]=a[l];
// return ;
// }
// int m=(l+r)>>1;
// build(u*2,l,m);
// build(u*2+1,m+1,r);
// pushup(u);
//}
bool in(int l,int r,int x,int y){
return (l>=x)&&(r<=y);
}
bool out(int l,int r,int x,int y){
return (l>y)||(r<x);
}
void work(int u,int l,int r){
lz[u] ^=1;
w[u]=(r-l+1)-w[u];
}
void pushdown(int u,int l,int r){
if(!w[u])return ;
int m=(l+r)>>1;
work(u*2,l,m);
work(u*2+1,m+1,r);
lz[u]=0;
}
void update(int u,int l,int r,int x,int y){
if(in(l,r,x,y)){
work(u,l,r);
return ;
}
else if(!out(l,r,x,y)){
int m=(l+r)>>1;
pushdown(u,l,r);
update(u*2,l,m,x,y);
update(u*2+1,m+1,r,x,y);
pushup(u);
}
}
int query(int u,int l,int r,int x,int y){
if(in(l,r,x,y)){
return w[u];
}
else if(!out(l,r,x,y)){
int m=(l+r)>>1;
pushdown(u,l,r);
return query(u*2,l,m,x,y)+query(u*2+1,m+1,r,x,y);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
// build(1,1,n);
for(int i=1;i<=m;i++){
cin>>opt>>x>>y;
if(opt==1){
cout<<query(1,1,n,x,y)<<endl;
}
else {
update(1,1,n,x,y);
}
}
return 0;
}
交进去一直RE,但是数组已经够大了吧