#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
int n, m, a[N], add[N], pos[N], L[N], R[N], sum[N];
void change(int l, int r) {
int p = pos[l], q = pos[r], cnt = 0;
if (p == q) {
for (int i = l; i <= r; ++i) cnt += a[i], a[i] = !a[i];
sum[p] = (r - l + 1) - cnt;
}
else {
for (int i = p + 1; i <= q - 1; ++i) add[i] = !add[i];
for (int i = l; i <= R[p]; ++i) cnt += a[i], a[i] = !a[i];
sum[p] = (R[p] - l + 1) - cnt;
cnt = 0;
for (int i = L[q]; i <= r; ++i) cnt += a[i], a[i] = !a[i];
sum[q] = (r - L[q] + 1) - cnt;
}
}
int ask(int l, int r) {
int p = pos[l], q = pos[r], ans = 0;
if (p == q) {
for (int i = l; i <= r; ++i) ans += a[i];
if (add[p]) ans = (r - l + 1) - ans;
}
else {
for (int i = p + 1; i <= q - 1; ++i) ans += (add[i]) ? (R[i] - L[i] + 1) - sum[i] : sum[i];
int cnt = 0;
for (int i = l; i <= R[p]; ++i) cnt += a[i];
if (add[p]) ans = (R[p] - l + 1) - cnt;
else ans += cnt;
cnt = 0;
for (int i = L[q]; i <= r; ++i) cnt += a[i];
if (add[q]) ans = (r - L[q] + 1) - cnt;
else ans += cnt;
}
return ans;
}
int main() {
scanf("%d%d", &n, &m);
int t = sqrt(n);
for (int i = 1; i <= t; ++i) {
L[i] = (i - 1) * t + 1;
R[i] = i * t;
}
if (R[t] < n) L[++t] = R[t - 1] + 1, R[t] = n;
for (int i = 1; i <= t; ++i)
for (int j = L[i]; j <= R[i]; ++j)
pos[j] = i;
while (m--) {
int opt, l, r;
scanf("%d%d%d", &opt, &l, &r);
if (!opt) change(l, r);
else printf("%d\n", ask(l, r));
}
return 0;
}
测了很多样例均无错误
大佬帮忙调调或者能给组hack吗