#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5*2+100;
ll a[maxn];char s[maxn];
ll tree[maxn<<2];
ll tag[maxn<<2];
ll ls(ll x){ return x<<1; };
ll rs(ll x){ return x<<1|1; };
void push_up(ll p){
tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(ll p,ll pl,ll pr){
tag[p]=0;
if(pl==pr){
tree[p]=a[pl];
return;
}
ll mid=(pl+pr)>>2;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void addtag(ll p,ll pl,ll pr){
tag[p]^=1;
tree[p]=pr-pl+1-tree[p];
}
void push_down(ll p,ll pl,ll pr){
if(tag[p]){
ll mid=(pl+pr)>>1;
addtag(ls(p),pl,mid);
addtag(rs(p),mid+1,pr);
tag[p]=0;
}
}
void update(ll L,ll R,ll p,ll pl,ll pr){
if(L<=pl&&pr<=R){
addtag(p,pl,pr);
return;
}
push_down(p,pl,pr);
ll mid=(pl+pr)>>1;
if(L<=mid) update(L,R,ls(p),pl,mid);
if(R>mid) update(L,R,rs(p),mid+1,pr);
push_up(p);
}
ll query(ll L,ll R,ll p,ll pl,ll pr){
if(pl>=L&&pr<=R) return tree[p];
push_down(p,pl,pr);
ll res=0;
ll mid=(pl+pr)>>1;
if(L<=mid) res+=query(L,R,ls(p),pl,mid);
if(R>mid) res+=query(L,R,rs(p),mid+1,pr);
return res;
}
int main()
{
ll n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];
a[i]=s[i]-'0';
}
while(m--){
ll q,L,R;
cin>>q>>L>>R;
if(q==0) update(L,R,1,1,n);
else cout<<query(L,R,1,1,n)<<endl;
}
return 0;
}