蒟蒻第一道分块……
#include <bits/stdc++.h>
using namespace std;
struct block {
int sum;
bool tag;
}b[1010];
int n, m, opt, in1, in2, len, id[100010];
bool a[100010];
void rev (int, int);
void query (int, int);
int main (){
scanf ("%d%d", &n, &m);
len = sqrt (n);
for (int i = 1; i <= n; i++)id[i] = (i - 1) / len + 1;
for (int i = 1; i <= m; i++){
scanf ("%d%d%d", &opt, &in1, &in2);
if (!opt)rev (in1, in2);
else query (in1, in2);
}
return 0;
}
void rev (int l, int r){
for (int i = l; i <= min (r, id[l] * len); i++){
b[id[l]].sum += a[i] ? -1 : 1;
a[i] ^= 1;
}
if (id[l] != id[r]){
for (int i = (id[r] - 1) * len + 1; i <= r; i++){
b[id[r]].sum += a[i] ? -1 : 1;
a[i] ^= 1;
}
}
for (int i = id[l] + 1; i <= id[r] - 1; i++){
b[i].tag ^= 1;
b[i].sum = id[i] == len + 1 ? n - len * len - b[i].sum : len - b[i].sum;
}
}
void query (int l, int r){
int ans = 0;
for (int i = l; i <= min (r, id[l] * len); i++)ans += a[i] ^ b[l].tag;
if (id[l] != id[r]){
for (int i = (id[r] - 1) * len + 1; i <= r; i++)ans += a[i] ^ b[r].tag;
}
for (int i = id[l] + 1; i <= id[r] - 1; i++)ans += b[i].sum;
cout << ans << '\n';
}