#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int n, m, a[MAXN], sum[MAXN * 4], tl[MAXN * 4], tr[MAXN * 4], tmid[MAXN * 4], lazy_tag[MAXN * 4];
char s[MAXN];
void push_up(int o) {
sum[o] = sum[o * 2] + sum[o * 2 + 1];
}
void push_down(int o) {
if (lazy_tag[o]) {
lazy_tag[o * 2] ^= 1;
lazy_tag[o * 2 + 1] ^= 1;
sum[o * 2] = tr[o * 2] - tl[o * 2] + 1 - sum[o * 2];
sum[o * 2 + 1] = tr[o * 2 + 1] - tl[o * 2 + 1] + 1 - sum[o * 2 + 1];
lazy_tag[o] = 0;
}
}
void build(int o, int l, int r) {
tl[o] = l, tr[o] = r;
if (l == r) {
sum[o] = a[l];
return;
}
tmid[o] = (l + r) / 2;
build(o * 2, l, tmid[o]);
build(o * 2 + 1, tmid[o] + 1, r);
push_up(o);
}
void modify(int o, int l, int r) {
if (tl[o] == l && tr[o] == r) {
sum[o] = tr[o] - tl[o] + 1 - sum[o];
lazy_tag[o] ^= 1;
return;
}
push_down(o);
if (r <= tmid[o]) modify(o * 2, l, r);
else if (l > tmid[o]) modify(o * 2 + 1, l, r);
else {
modify(o * 2, l, tmid[o]);
modify(o * 2 + 1, tmid[o] + 1, r);
push_up(o);
}
}
int query(int o, int l, int r) {
if (tl[o] == l && tr[o] == r) return sum[o];
push_down(o);
if (r <= tmid[o]) return query(o * 2, l, r);
if (l > tmid[o]) return query(o * 2 + 1, l, r);
return query(o * 2, l, tmid[o]) + query(o * 2 + 1, tmid[o] + 1, r);
}
int main() {
cin >> n >> m >> s;
for (int i = 0; i < n; i++) {
a[i + 1] = s[i] - '0';
}
build(1, 1, n);
while (m--) {
int op, l, r;
cin >> op >> l >> r;
if (op == 0) {
modify(1, l, r);
}
else cout << query(1, l, r) << endl;
}
return 0;
}