#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
struct node{
int l,r,num,add;
}tr[maxn << 4];
int a[maxn];
#define lc p << 1
#define rc p << 1 | 1
void up(int p){
tr[p].num = tr[lc].num + tr[rc].num;
}
void down(int p,int len){
if(tr[p].add){
tr[lc].num = (len - (len >> 1)) - tr[lc].num;
tr[rc].num = (len >> 1) - tr[rc].num;
tr[lc].add ^= 1;
tr[rc].add ^= 1;
tr[p].add = 0;
}
}
void build(int p,int l,int r){
tr[p] = {l,r,a[l],0};
if(l == r)
return ;
int m = (l + r) >> 1;
build(lc,l,m);
build(rc,m + 1,r);
up(p);
}
void update(int p,int x,int y){
if(x <= tr[p].l && tr[p].r <= y){
tr[p].num = (y - x + 1) - tr[p].num;
tr[p].add ^= 1;
return ;
}
int m = (tr[p].l + tr[p].r) >> 1;
down(p,y - x + 1);
if(x <= m)
update(lc,x,y);
if(y >= m + 1)
update(rc,x,y);
up(p);
}
int query(int p,int l,int r){
if(l <= tr[p].l && tr[p].r <= r)
return tr[p].num;
down(p,r - l + 1);
int m = (tr[p].l + tr[p].r) >> 1;
int ans = 0;
if(l <= m)
ans += query(lc,l,r);
if(r >= m + 1)
ans += query(rc,l,r);
return ans;
}
int n,m;
char s[maxn];
int main(){
cin >> n >> m;
for(int i = 1;i <= n;i ++)
cin >> s[i];
for(int i = 1;i <= n;i ++)
a[i] = s[i] - '0';
build(1,1,n);
for(int i = 1;i <= m;i ++){
int op,l,r;
cin >> op >> l >> r;
if(op == 0)
update(1,l,r);
else
cout << query(1,l,r) << endl;
}
return 0;
}