#include<bits/stdc++.h>
#define int long long
#define cal int mid = (l + r) / 2,lchild = root * 2,rchild = root * 2 + 1;
#define upd tree[root].val = tree[lchild].val + tree[rchild].val;
using namespace std;
const int N = 1e6 + 9,ROOT = 1;
struct node {
int val,tag;
} tree[N];
int Len(int l,int r){
return r - l + 1;
}
void make_tag(int root,int len){
tree[root].val = len - tree[root].val;
tree[root].tag ^= 1;
}
void push_down(int root,int l,int r){
cal;
make_tag(lchild,Len(l,mid));
make_tag(rchild,Len(mid + 1,r));
tree[root].tag = 0;
}
void update(int s,int t,int l,int r,int root) {
if(s <= l && r <= t) {
make_tag(root,Len(l,r));
return;
}
cal
push_down(root,l,r);
if(s <= mid)
update(s,t,l,mid,lchild);
if(t > mid)
update(s,t,mid + 1,r,rchild);
upd
}
int getsum(int s, int t, int l, int r, int root) {
if(s <= l && r <= t)
return tree[root].val;
cal
push_down(root,l,r);
int sum = 0;
if(s <= mid)
sum += getsum(s,t,l,mid,lchild);
if(t > mid)
sum += getsum(s,t,mid + 1,r,rchild);
return sum;
}
int n,m;
int op,x,y,k;
signed main() {
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= m; i++) {
scanf("%lld%lld%lld", &op, &x, &y);
if(op == 0)
update(1,n,x,y,ROOT);
else if(op == 1)
printf("%lld\n", getsum(1,n,x,y,ROOT));
}
}