#include <iostream>
using namespace std;
const int N=2e5+9;
int n,m,len,op,l,r,a[N];
string s;
struct node{
int sum,add;
}tree[N<<1];
void pushup(int root){
tree[root].sum=tree[root<<1].sum+tree[root<<1|1].sum;
}
void build(int root,int l,int r){
if(l==r){
tree[root].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(root<<1,l,mid),build(root<<1|1,mid+1,r);
pushup(root);
}
void pushdown(int root,int len){
if(tree[root].add){
tree[root<<1].add^=1;
tree[root<<1|1].add^=1;
tree[root<<1].sum=(len-(len>>1))-tree[root<<1].sum;
tree[root<<1|1].sum=(len>>1)-tree[root<<1|1].sum;
tree[root].add=0;
}
}
int sum(int root,int l,int r,int L,int R){
if(l>=L&&r<=R){
return tree[root].sum;
}
pushdown(root,r-l+1);
int mid=(l+r)>>1,ans;
if(L<=mid){
ans+=sum(root<<1,l,mid,L,R);
}
if(mid+1<=R){
ans+=sum(root<<1|1,mid+1,r,L,R);
}
return ans;
}
void solve(int root,int l,int r,int L,int R){
pushdown(root,r-l+1);
if(l>=L&&r<=R){
tree[root].add^=1,tree[root].sum=r-l+1-tree[root].sum;
return;
}
int mid=(l+r)>>1;
if(L<=mid){
solve(root<<1,l,mid,L,R);
}
if(mid+1<=R){
solve(root<<1|1,mid+1,r,L,R);
}
pushup(root);
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>s;
len=s.size();
for (int i=1;i<=len;i++){
a[i]=s[i-1]-'0';
}
build(1,1,n);
while(m--){
cin>>op>>l>>r;
if(op==0){
solve(1,1,n,l,r);
}
if(op==1){
cout<<sum(1,1,n,l,r)<<endl;
}
}
return 0;
}