#include<bits/stdc++.h>
using namespace std;
const int mx=1e6+10;
int n,m;
struct node{
int l,r;
long long sum;
bool lazy=false;
}tree[mx];
void BuildSegmentTree(int i,int l,int r){
tree[i].l=l;
tree[i].r=r;
if(l==r){
tree[i].sum=0;
return;
}
int mid=(tree[i].l+tree[i].r)>>1;
BuildSegmentTree(i<<1,l,mid);
BuildSegmentTree(i<<1|1,mid+1,r);
tree[i].sum=0;
}
void PushDown(int i,int l,int r){
int mid=(l+r)>>1;
if(tree[i].lazy){
tree[i<<1].lazy=!tree[i<<1].lazy;
tree[i<<1|1].lazy=!tree[i<<1+1].lazy;
tree[i<<1].sum=(mid-l+1-tree[i<<1].sum);
tree[i<<1|1].sum=r-mid-tree[i<<1|1].sum;
tree[i].lazy=false;
}
}
void Change(int i,int x,int y){
if(tree[i].l>=x&&tree[i].r<=y){
tree[i].sum=tree[i].r-tree[i].l+1-tree[i].sum;
tree[i].lazy=!tree[i].lazy;
return;
}
PushDown(i,tree[i].l,tree[i].r);
int mid=(tree[i].l+tree[i].r)>>1;
if(x<=mid) Change(i<<1,x,y);
if(y>mid) Change(i<<1|1,x,y);
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}
int QueryIntervals(int i,int x,int y){
if(x<=tree[i].l&&y>=tree[i].r) return tree[i].sum;
if(x>tree[i].r||y<tree[i].l) return 0;
PushDown(i,tree[i].l,tree[i].r);
int ans=0;
int mid=(tree[i].l+tree[i].r)>>1;
if(mid>=x) ans+=QueryIntervals(i<<1,x,y);
if(y>mid) ans+=QueryIntervals(i<<1|1,x,y);
return ans;
}
int main(){
cin>>n>>m;
BuildSegmentTree(1,1,n);
int c,a,b;
while(m--){
cin>>c>>a>>b;
if(c==0) Change(1,a,b);
else cout<<QueryIntervals(1,a,b)<<endl;
}
return 0;
}