如题
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <iomanip>
#include <queue>
#include <stack>
#define lld long long int
#define ls(k) (k)<<1
#define rs(k) (k)<<1|1
using namespace std;
const int MAXN = int(2 * 10e5);
inline void Init() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
inline int Read()
{
char ch = getchar(); int x = 0, f = 1;
while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
lld n, m;
int a[MAXN];
struct {
lld l, r;
lld sum, times;
lld i=1 ;
}t[4*MAXN+5];
void Build(int i, int l, int r) {
t[i].l = l, t[i].r = r;
if (l == r) {
t[i].i = 1;
t[i].sum = (a[l] == 1 ? 1 : 0);
return;
}
int mid = (l + r) / 2;
Build(i * 2, l, mid);
Build(i * 2 + 1, mid + 1, r);
t[i].sum = t[i * 2].sum + t[i * 2 + 1].sum;
t[i].i = t[i * 2].i + t[i * 2 + 1].i;
}
void Spread(int i) {
if (t[i].times) {
t[i * 2].sum = (t[i].times % 2 == 0 ? t[i * 2].sum : t[i * 2].i - t[i * 2].sum);
t[i * 2 + 1].sum = (t[i].times % 2 == 0 ? t[i * 2 + 1].sum : t[i * 2 + 1].i - t[i * 2 + 1].sum);
t[i * 2].times+=t[i].times;
t[i * 2 + 1].times += t[i].times;
t[i].times = 0;
}
}
void Add(int i,int l,int r) {
if (l <= t[i].l && t[i].r <= r) {
t[i].times++;
t[i].sum = t[i].i - t[i].sum;
return;
}
Spread(i);
int mid = (t[i].l + t[i].r) / 2;
if (l <= mid)Add(i * 2, l, r);
if (mid < r)Add(i * 2 + 1, l, r);
t[i].sum = t[i * 2].sum + t[i * 2 + 1].sum;
}
int Find(int i, int l, int r) {
if (l <= t[i].l && t[i].r <= r) {
return t[i].sum;
}
Spread(i);
int ans = 0;
int mid = (t[i].l + t[i].r) / 2;
if (l <= mid)ans += Find(i * 2, l, r);
if (mid < r)ans += Find(i * 2 + 1, l, r);
return ans;
}
int main()
{
Init();
cin >> n >> m;
char ch;
for (int i = 1; i <= 4 * n; ++i) {
t[i].i = 1;
}
for (int i = 1; i <= n; ++i) {
cin >> ch;
if (ch == '1')
a[i] = 1;
else
a[i] = 0;
}
Build(1, 1, n);
int o, l, r;
while (m--) {
cin >> o >> l >> r;
if (o == 0) {
Add(1, l, r);
//反转次数++
}
else {
cout << Find(1, l, r) << "\n";
//统计
}
}
return 0;
}