#include<iostream>
using namespace std;
struct Segment_Tree{int num,tag;}t[524288];
int n,m,o,l,r;
char c[262144];
void Getup(int d){
t[d].num=t[d<<1].num+t[d<<1|1].num;
}
void PushDown(int d,int q){
if(t[d].tag){
t[d<<1].tag^=1;
t[d<<1|1].tag^=1;
t[d<<1].num=(q-(q>>1))-t[d<<1].num;
t[d<<1|1].num=(q>>1)-t[d<<1|1].num;
t[d].tag=0;
}
}
void Build(int b,int e,int d){
if(b==e){
t[d].num=c[b];
return;
}
int mid=(b+e)>>1;
Build(b,mid,d<<1);
Build(mid+1,e,d<<1|1);
Getup(d);
}
void Change(int b,int e,int d){
PushDown(d,e-b+1);
if(l<=b&&e<=r){
t[d].tag^=1;
t[d].num=e-b+1-t[d].num;
return;
}
int mid=(b+e)>>1;
if(l<=mid)Change(b,mid,d<<1);
if(mid+1<=r)Change(mid+1,e,d<<1|1);
Getup(d);
}
int Query(int b,int e,int d){
if(l<=b&&e<=r)return t[d].num;
PushDown(d,e-b+1);
int mid=(b+e)>>1,s=0;
if(l<=mid)s+=Query(b,m,d<<1);
if(mid+1<=r)s+=Query(m+1,e,d<<1|1);
return s;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m>>c+1;
for(int i=1;i<=n;i++)c[i]-=48;
Build(1,n,1);
while(m--){
cin>>o>>l>>r;
if(o==0)Change(1,n,1);
else cout<<Query(1,n,1)<<endl;
}
return 0;
}
RT