#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,sum;
}C[1000010];
int n,m,a[200010],op,l,r,lazy[1000010];
inline void pushup(int id)
{
C[id].sum=C[id<<1].sum+C[id<<1|1].sum;
}
inline void pushdown(int id)
{
if(lazy[id])
{
lazy[id<<1]^=1;
lazy[id<<1|1]^=1;
int len=C[id].l+C[id].r;
C[id<<1].sum=(len-(len>>1))-C[id<<1].sum;
C[id<<1|1].sum=(len>>1)-C[id<<1|1].sum;
lazy[id]=0;
}
}
inline void build(int id,int l,int r)
{
C[id].l=l;
C[id].r=r;
if(l==r)
{
C[id].sum=a[l];
return;
}
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(id);
}
inline void update(int id,int l,int r)
{
if(l<=C[id].l&&C[id].r<=r)
{
C[id].sum=(C[id].r-C[id].l+1)-C[id].sum;
lazy[id]^=1;
return;
}
pushdown(id);
int mid=C[id].l+C[id].r>>1;
if(l<=mid)
{
update(id<<1,l,r);
}
if(r>mid)
{
update(id<<1|1,l,r);
}
pushup(id);
}
inline int query(int id,int l,int r)
{
if(l<=C[id].l&&C[id].r<=r)
{
return C[id].sum;
}
pushdown(id);
int mid=C[id].l+C[id].r>>1,sum=0;
if(l<=mid)
{
sum+=query(id<<1,l,r);
}
if(r>mid)
{
sum+=query(id<<1|1,l,r);
}
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%1d",&a[i]);
}
build(1,1,n);
while(m--)
{
cin>>op>>l>>r;
if(op&1)
{
cout<<query(1,l,r)<<"\n";
}
else
{
update(1,l,r);
}
}
}