救救蒟蒻吧
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10;
int n,m;
string s;
struct node{
int l, r, sum;
}tree[N << 4];
void Pushup(int rt)
{
tree[rt].sum = tree[rt * 2].sum + tree[rt * 2 + 1].sum;
}
void build(int l, int r, int rt)
{
tree[rt].l = l;
tree[rt].r = r;
if(l == r)
{
tree[rt].sum = s[l] - '0';
return;
}
int mid = l + r >> 1;
build(l, mid, rt * 2);
build(mid + 1, r, rt * 2 + 1);
Pushup(rt);
}
void Updata(int rt, int l, int r, int pos)
{
if(tree[rt].l == tree[rt].r)
{
tree[rt].sum ^= 1;
return;
}
int mid = tree[rt].l + tree[rt].r >> 1;
if(pos <= mid)
Updata(rt * 2, l, mid, pos);
if(pos > mid)
Updata(rt * 2 + 1, mid + 1, r, pos);
Pushup(rt);
}
int query(int rt, int l, int r)
{
if(l <= tree[rt].l && r >= tree[rt].r)
{
return tree[rt].sum;
}
int mid = tree[rt].l + tree[rt].r >> 1;
int res = 0;
if(l <= mid)
res += query(rt * 2, l, mid);
if(r > mid)
res += query(rt * 2 + 1, mid + 1, r);
return res;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> s;
s = " " + s;
build(1, n, 1);
while(m --)
{
int op, l, r;
cin >> op >> l >> r;
if(op == 0)
{
for(int i=l;i<=r;i++)
{
Updata(1, 1, n, i);
}
}
else
{
cout << query(1, l, r) << endl;
}
}
return 0;
}