#include <stdio.h>
enum{M=100001};
int tree[M*4],lazy[M*4],n;
void update(int l, int r, int i, int curl, int curr) {
if(curl >= l && curr <= r) {
tree[i]=curr-curl+1-tree[i];
lazy[i]^=1;
return;
}
if(curl<r||curr>l)return;
if(lazy[i]) {
lazy[i<<1]^=lazy[i];
lazy[(i<<1)+1]^=lazy[i];
tree[i<<1]=curr-curl+1-tree[(i<<1)];
tree[(i<<1)+1]=curr-curl+1-tree[(i<<1)+1];
lazy[i]=0;
}
int mid=(curl+curr)>>1;
if(l<=mid)update(l,r,i<<1,curl,mid);
if(r>mid)update(l,r,(i<<1)+1,mid+1,curr);
tree[i]=tree[i<<1]+tree[(i<<1)+1];
}
int get(int l, int r, int i, int curl, int curr) {
if(curl >= l && curr <= r) {
return tree[i];
}
if(curl<r||curr>l)return 0;
if(lazy[i]) {
lazy[i<<1]^=lazy[i];
lazy[(i<<1)+1]^=lazy[i];
tree[i<<1]=curr-curl+1-tree[(i<<1)];
tree[(i<<1)+1]=curr-curl+1-tree[(i<<1)+1];
lazy[i]=0;
}
int mid=(curl+curr)>>1,ret=0;
if(l<=mid)ret += get(l,r,i<<1,curl,mid);
if(r>mid)ret += get(l,r,(i<<1)+1,mid+1,curr);
return ret;
}
int main() {
int m,a,b,c,i;
scanf("%d%d", &n, &m);
for(i = 1; i <= m; i ++) {
scanf("%d%d%d", &a, &b, &c);
if(a==1) {
printf("%d\n",get(b,c,1,1,n));
}
else {
update(b,c,1,1,n);
}
}
return 0;
}
'''