#include<iostream>
using namespace std;
const int N = 320010;
char a[N * 4];
struct Node{
int l,r;
int sum;
bool add;
} tr[N * 4];
void pushup(int u){
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void pushdown(int u){
auto &root = tr[u] , &left = tr[u << 1] , &right = tr[u << 1 | 1];
if(root.add){
left.add ^= 1;
right.add ^= 1;
int llen = left.r - left.l + 1;
left.sum = llen - left.sum;
int rlen = right.r - right.l + 1;
right.sum = rlen - right.sum;
root.add = 0;
}
}
void modify(int u , int l , int r){
if(tr[u].l >= l && tr[u].r <= r) {
tr[u].sum = (tr[u].r - tr[u].l + 1) - tr[u].sum;
tr[u].add = 1;
} else {
pushdown(u);
int 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);
}
}
int query(int u , int l , int r){
if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
pushdown(u); // 记得传递懒标记
int v = 0;
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) v += query(u << 1 , l , r);
if(r > mid) v += query(u << 1 | 1 , l , r);
return v;
}
void build(int u , int l , int r){
if(l == r) tr[u] = { r, r , a[r] - '0', 0};
else {
tr[u] = {l , r}; // 记得更新区间端点
int mid = l + r >> 1;
build(u << 1 , l , mid);
build(u << 1 | 1 , mid + 1 , r);
pushup(u);
}
}
signed main(){
int n,m;cin >> n >> m;
cin >> a + 1;
build(1,1,n);
// for(int i = 1;i <= n;i ++ )cout << tr[i].sum << " ";
// cout << tr[1].sum << '\n';
while(m -- ) {
int t,l,r;
cin >> t >> l >> r;
if(t) {
cout << query(1, l, r) << '\n';
} else {
modify(1, l , r);
}
}
}