#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5 + 5;
const int BLOCK_SIZE = 505;
bool a[MAX_N];
int cnt[2][MAX_N / BLOCK_SIZE + 5];
int flip[MAX_N];
int n;
void manualUpdate(int id, int l, int r){
int L = id * BLOCK_SIZE;
int R = (id + 1) * BLOCK_SIZE - 1;
R = min(R, n - 1);
if(flip[id] & 1){
swap(cnt[0][id], cnt[1][id]);
for(int i = L; i <= R; i++)
a[i] = !a[i];
}
flip[id] = 0;
for(int i = l; i <= r; i++)
a[i] = !a[i];
cnt[0][id] = cnt[1][id] = 0;
for(int i = L; i <= R; i++)
cnt[0][id] += !a[i],
cnt[1][id] += a[i];
}
void blockUpdate(int lB, int rB){
for(int i = lB; i <= rB; i++)
flip[i]++;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int m;
cin >> n >> m;
for(int i = 0; i < n; i++)
cnt[0][i / BLOCK_SIZE]++;
while(m--){
int query;
cin >> query;
if(query == 0){
int l, r;
cin >> l >> r;
--l, --r;
int blockL = l / BLOCK_SIZE;
int blockR = r / BLOCK_SIZE;
// assert(blockL == blockR);
if(blockL == blockR)
manualUpdate(blockL, l, r);
else{
blockUpdate(blockL + 1, blockR - 1);
manualUpdate(blockL, l, (blockL + 1) * BLOCK_SIZE - 1);
manualUpdate(blockR, blockR * BLOCK_SIZE, r);
}
}
else{
int l, r;
cin >> l >> r;
--l, --r;
int blockL = l / BLOCK_SIZE;
int blockR = r / BLOCK_SIZE;
int ans = 0;
// assert(blockL == blockR);
if(blockL == blockR){
for(int i = l; i <= r; i++)
ans += (flip[blockL] & 1 ? !a[i] : a[i]);
cout << ans << '\n';
continue;
}
for(int i = blockL + 1; i <= blockR - 1; i++)
ans += (flip[i] & 1 ? cnt[0][i] : cnt[1][i]);
for(int i = l, endP = (blockL + 1) * BLOCK_SIZE - 1; i <= endP; i++)
ans += (flip[blockL] & 1 ? !a[i] : a[i]);
for(int i = blockR * BLOCK_SIZE; i <= r; i++)
ans += (flip[blockR] & 1 ? !a[i] : a[i]);
cout << ans << '\n';
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNQVhfTiA9IDFlNSArIDU7CmNvbnN0IGludCBCTE9DS19TSVpFID0gNTA1OwoKYm9vbCBhW01BWF9OXTsKaW50IGNudFsyXVtNQVhfTiAvIEJMT0NLX1NJWkUgKyA1XTsKaW50IGZsaXBbTUFYX05dOwppbnQgbjsKCnZvaWQgbWFudWFsVXBkYXRlKGludCBpZCwgaW50IGwsIGludCByKXsKICBpbnQgTCA9IGlkICogQkxPQ0tfU0laRTsKICBpbnQgUiA9IChpZCArIDEpICogQkxPQ0tfU0laRSAtIDE7CiAgUiA9IG1pbihSLCBuIC0gMSk7CgogIGlmKGZsaXBbaWRdICYgMSl7CiAgICBzd2FwKGNudFswXVtpZF0sIGNudFsxXVtpZF0pOwogICAgZm9yKGludCBpID0gTDsgaSA8PSBSOyBpKyspCiAgICAgIGFbaV0gPSAhYVtpXTsKICB9CgogIGZsaXBbaWRdID0gMDsKCiAgZm9yKGludCBpID0gbDsgaSA8PSByOyBpKyspCiAgICBhW2ldID0gIWFbaV07CgogIGNudFswXVtpZF0gPSBjbnRbMV1baWRdID0gMDsKICBmb3IoaW50IGkgPSBMOyBpIDw9IFI7IGkrKykKICAgIGNudFswXVtpZF0gKz0gIWFbaV0sCiAgICBjbnRbMV1baWRdICs9IGFbaV07Cn0KCnZvaWQgYmxvY2tVcGRhdGUoaW50IGxCLCBpbnQgckIpewogIGZvcihpbnQgaSA9IGxCOyBpIDw9IHJCOyBpKyspCiAgICBmbGlwW2ldKys7Cn0KCmludCBtYWluKCl7CiAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICBjaW4udGllKDApOwogIGNvdXQudGllKDApOwoKICBpbnQgbTsKICBjaW4gPj4gbiA+PiBtOwoKICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgY250WzBdW2kgLyBCTE9DS19TSVpFXSsrOwoKICB3aGlsZShtLS0pewogICAgaW50IHF1ZXJ5OwogICAgY2luID4+IHF1ZXJ5OwoKICAgIGlmKHF1ZXJ5ID09IDApewogICAgICBpbnQgbCwgcjsKICAgICAgY2luID4+IGwgPj4gcjsKICAgICAgLS1sLCAtLXI7CgogICAgICBpbnQgYmxvY2tMID0gbCAvIEJMT0NLX1NJWkU7CiAgICAgIGludCBibG9ja1IgPSByIC8gQkxPQ0tfU0laRTsKCiAgICAgIC8vIGFzc2VydChibG9ja0wgPT0gYmxvY2tSKTsKCiAgICAgIGlmKGJsb2NrTCA9PSBibG9ja1IpCiAgICAgICAgbWFudWFsVXBkYXRlKGJsb2NrTCwgbCwgcik7CiAgICAgIGVsc2V7CiAgICAgICAgYmxvY2tVcGRhdGUoYmxvY2tMICsgMSwgYmxvY2tSIC0gMSk7CiAgICAgICAgbWFudWFsVXBkYXRlKGJsb2NrTCwgbCwgKGJsb2NrTCArIDEpICogQkxPQ0tfU0laRSAtIDEpOwogICAgICAgIG1hbnVhbFVwZGF0ZShibG9ja1IsIGJsb2NrUiAqIEJMT0NLX1NJWkUsIHIpOwogICAgICB9CiAgICB9CgogICAgZWxzZXsKICAgICAgaW50IGwsIHI7CiAgICAgIGNpbiA+PiBsID4+IHI7CiAgICAgIC0tbCwgLS1yOwoKICAgICAgaW50IGJsb2NrTCA9IGwgLyBCTE9DS19TSVpFOwogICAgICBpbnQgYmxvY2tSID0gciAvIEJMT0NLX1NJWkU7CiAgICAgIGludCBhbnMgPSAwOwoKICAgICAgLy8gYXNzZXJ0KGJsb2NrTCA9PSBibG9ja1IpOwoKICAgICAgaWYoYmxvY2tMID09IGJsb2NrUil7CiAgICAgICAgZm9yKGludCBpID0gbDsgaSA8PSByOyBpKyspCiAgICAgICAgICBhbnMgKz0gKGZsaXBbYmxvY2tMXSAmIDEgPyAhYVtpXSA6IGFbaV0pOwoKICAgICAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBmb3IoaW50IGkgPSBibG9ja0wgKyAxOyBpIDw9IGJsb2NrUiAtIDE7IGkrKykKICAgICAgICBhbnMgKz0gKGZsaXBbaV0gJiAxID8gY250WzBdW2ldIDogY250WzFdW2ldKTsKICAgICAgZm9yKGludCBpID0gbCwgZW5kUCA9IChibG9ja0wgKyAxKSAqIEJMT0NLX1NJWkUgLSAxOyBpIDw9IGVuZFA7IGkrKykKICAgICAgICBhbnMgKz0gKGZsaXBbYmxvY2tMXSAmIDEgPyAhYVtpXSA6IGFbaV0pOwogICAgICBmb3IoaW50IGkgPSBibG9ja1IgKiBCTE9DS19TSVpFOyBpIDw9IHI7IGkrKykKICAgICAgICBhbnMgKz0gKGZsaXBbYmxvY2tSXSAmIDEgPyAhYVtpXSA6IGFbaV0pOwogICAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgfQogIH0KCiAgcmV0dXJuIDA7Cn0=