#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n, m;
struct node {
ll l, r, w, lz;
}tree[N<<2];
void build(ll u, ll l, ll r) {
tree[u].lz=0;
tree[u].l=l, tree[u].r=r;
if (l==r) return;
ll mid=l+r>>1;
build((u<<1)+1, mid+1, r), build(u<<1, l, mid);
tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
}
void maketag(ll u, ll l, ll r) {
tree[u].w=r-l+1-tree[u].w;
tree[u].lz^=1;
}
void update(ll u, ll l, ll r, ll L, ll R) {
if (L>=l && R<=r) maketag(u, L, R);
else if (L<l && R>r) return;
else {
ll mid=l+r>>1;
maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
tree[u].lz=0;
update(u<<1, l, mid, L, R), update((u<<1)+1, mid+1, r, L, R);
tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
}
}
ll query(ll u, ll l, ll r, ll L, ll R) {
if (L>=l && R<=r) return tree[u].w;
else if (L<l && R>r) return 0;
else {
ll mid=l+r>>1;
maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
tree[u].lz=0;
return query(u<<1, l, mid, L, R) + query((u<<1)+1, mid+1, r, L, R);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m;
build(1, 1, n);
while (m--) {
ll opt, x, y;
cin>>opt>>x>>y;
if (opt==0) {
update(1, 1, n, x, y);
}else cout<<query(1, 1, n, x, y)<<"\n";
}
return 0;
}