#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
#define endl '\n'
const ll N = 2e5+10;
int n, m, a[N];
struct node
{
ll l, r;
ll sum, add;
}tr[N * 4];
inline void pushup(ll u)
{
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
inline void pushdown(ll u)
{
if(tr[u].add)
{
ll ls = u << 1, rs = u << 1 | 1;
tr[ls].add ^= 1, tr[rs].add ^= 1;
tr[ls].sum = (tr[ls].r - tr[ls].l + 1) - tr[ls].sum;
tr[rs].sum = (tr[rs].r - tr[rs].l + 1) - tr[rs].sum;
tr[u].add = 0;
}
}
inline void build(ll u, ll l, ll r)
{
if(l == r)
{
tr[u] = {l, r, a[l], 0};
}
else
{
tr[u] = {l, r};
ll mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
inline void modify(ll u, ll l, ll r)
{
if(tr[u].l >= l && tr[u].r <= r)
{
tr[u].add ^= 1;
tr[u].sum = (tr[u].r - tr[u].l + 1) - tr[u].sum;
}
else
{
if(tr[u].add) pushdown(u);
ll mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) modify(u << 1, l, r);
if(r > mid) modify(u << 1 | 1, l, r);
pushup(u);
}
}
inline ll query(ll u, ll l, ll r)
{
if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
else
{
if(tr[u].add) pushdown(u);
ll sum = 0;
ll mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) sum = query(u << 1, l, r);
if(r > mid) sum += query(u << 1 | 1, l, r);
return sum;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> m;
for(rl i=1;i <= n;++ i) scanf("%1d", &a[i]);
build(1, 1, n);
while(m --)
{
ll op, x, y;
cin >> op >> x >> y;
if(op)
{
cout << query(1, x, y) << endl;
}
else
{
modify(1, x, y);
}
}
return 0;
}