#include<bits/stdc++.h>
#define ll long long
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
const int maxn=100005;
ll n,m,a[maxn];
struct seg_tree{
int l,r;
ll lazy,sum;
}tr[maxn*4];
void pushup(int id){
tr[id].sum=tr[id<<1].sum+tr[id<<1|1].sum;
}
void build(int id,int l,int r){
tr[id].l=l;
tr[id].r=r;
if(l==r){
tr[id].sum=a[l];
return;
}
int mid=(l+r)/2;
build(lid,l,mid);
build(rid,mid+1,r);
pushup(id);
}
void pushdown(long long id,int len){
if(tr[id].lazy&&tr[id].l!=tr[id].r){
tr[lid].lazy^=1;
tr[rid].lazy^=1;
tr[lid].sum=(len-(len>>1))-tr[lid].sum;
tr[rid].sum=(len>>1)-tr[rid].sum;
tr[id].lazy=0;
}
}
void add(int id,int l,int r,long long val){
pushdown(id,r-l+1);
if(l<=tr[id].l&&tr[id].r<=r){
tr[id].lazy^=1;
tr[id].sum=r-l+1-tr[id].sum;
return;
}
int mid=(tr[id].l+tr[id].r)/2;
if(mid+1<=r)add(rid,l,r,val);
if(l<=mid)add(lid,l,r,val);
pushup(id);
}
long long query(long long id,long long l,long long r){
pushdown(id,r-l+1);
if(l<=tr[id].l&&tr[id].r<=r) return tr[id].sum;
int mid=(tr[id].l+tr[id].r)/2;
long long ans=0;
if(l<=mid) ans+=query(id*2,l,r);
if(r>mid) ans+=query(id*2+1,l,r);
return ans;
}
int main(){
cin>>n>>m;
string s;
cin>>s;
for(int i=0;i<s.length();i++){
a[i]=s[i]-'0';
}
build(1,1,n);
while(m--){
int op,x,y;
ll k;
scanf("%d",&op);
if(op==0){
scanf("%d%d",&x,&y);
add(1,x,y,1);
}
else{
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,x,y));
}
}
return 0;
}