#include <iostream>
using namespace std;
const int N = 2e5 + 5;
int n, m;
char s[N];
int t[N << 2];
bool lazy[N << 2];
inline void pushup(int k)
{
t[k] = t[k << 1] + t[k << 1 | 1];
}
inline void pushdown(int k, int ln, int rn)
{
t[k << 1] = ln - t[k << 1];
t[k << 1 | 1] = rn - t[k << 1 | 1];
lazy[k << 1] = ~lazy[k << 1];
lazy[k << 1 | 1] = ~lazy[k << 1 | 1];
lazy[k] = 0;
}
void maketree(int k, int l, int r)
{
if(l == r)
{
t[k] = s[l] - '0';
return;
}
int mid = l + (r - l >> 1);
maketree(k << 1, l, mid);
maketree(k << 1 | 1, mid + 1, r);
pushup(k);
}
void update(int k, int x, int y, int l, int r)
{
if(x <= l && y >= r)
{
lazy[k] = ~lazy[k];
t[k] = r - l + 1 - t[k];
return;
}
int mid = l + (r - l >> 1);
if(lazy[k])
pushdown(k, mid - l + 1, r - mid);
if(x <= mid)
update(k << 1, x, y, l, mid);
if(y > mid)
update(k << 1 | 1, x, y, mid + 1, r);
pushup(k);
}
int query(int k, int x, int y, int l, int r)
{
if(x <= l && y >= r)
return t[k];
int mid = l + (r - l >> 1);
int lson = k << 1;
int rson = lson | 1, ans = 0;
pushdown(k, mid - l + 1, r - mid);
if(x <= mid)
ans += query(lson, x, y, l, mid);
if(y > mid)
ans += query(rson, x, y, mid + 1, r);
return ans;
}
int main(void)
{
int op, x, y;
cin >> n >> m;
cin >> s + 1;
maketree(1, 1, n);
while(m--)
{
cin >> op >> x >> y;
if(op == 0)
update(1, x, y, 1, n);
else
{
cout << query(1, x, y, 1, n) << '\n';
}
}
return 0;
}