// Problem: P3372 【模板】线段树 1
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3372
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+5;
int n,q;
int a[N];
struct node{
ll l,r,val,sz;
}seg[N*4];
void update(int id){
seg[id].val=seg[id*2].val+seg[id*2+1].val;
}
void settag(int id){
seg[id].val=seg[id].r-seg[id].l+1-seg[id].val;
seg[id].sz^=1;
}
void pushdown(int id){
if(seg[id].sz!=0){
settag(id*2);
settag(id*2+1);
seg[id].sz=0;
}
}
void build(int id,int l,int r){
seg[id].sz=r-l+1;
if(l==r){
seg[id].val={a[l]};
}
else{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
update(id);
}
}
void modify(int id,int l,int r,int ql,int qr){
if(l==ql&&r==qr){
settag(id);
return;
}
int mid=(l+r)/2;
pushdown(id);
if(qr<=mid){
modify(id*2,l,mid,ql,qr);
}
else if(ql>mid){
modify(id*2+1,mid+1,r,ql,qr);
}
else{
modify(id*2,l,mid,ql,mid);
modify(id*2+1,mid+1,r,mid+1,qr);
}
update(id);
}
ll query(int id,int l,int r,int ql,int qr){
if(l==ql&&r==qr){
return seg[id].val;
}
int mid=(l+r)/2;
pushdown(id);
if(qr<=mid){
return query(id*2,l,mid,ql,qr);
}
else if(ql>mid){
return query(id*2+1,mid+1,r,ql,qr);
}
else{
return query(id*2,l,mid,ql,mid)+query(id*2+1,mid+1,r,mid+1,qr);
}
}
int main(){
cin>>n>>q;
// for(int i=1;i<=n;i++){
// a[i]=0;
// }
// build(1,1,n);
for(int i=0;i<q;i++){
int ty;
cin>>ty;
if(ty==0){
int l,r;
cin>>l>>r;
modify(1,1,n,l,r);
}
else{
int l,r;
cin>>l>>r;
cout<<query(1,1,n,l,r)<<"\n";
}
}
return 0;
}