#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char c=getchar();
while(c>'9'||c<'0'){
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x;
}
int n,m;
int opt;
bool a[200001];
int t[200001<<2];
bool lazy[200001<<2];
void pushup(int x){
t[x]=t[x<<1]+t[x<<1|1];
}
void build(int x,int l,int r){
if(l==r){
t[x]+=a[l];
}else{
int mid=((l+r)>>1);
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
}
void pushdown(int x,int l,int r){
if(lazy[x]){
int mid=((l+r)>>1);
t[x<<1]=(l-mid+1)-t[x<<1];
t[x<<1|1]=(r-mid)-t[x<<1|1];
lazy[x<<1]^=1;
lazy[x<<1|1]^=1;
lazy[x]=0;
}
}
void update(int x,int L,int R,int l,int r){
pushdown(x,l,r);
if(L<=l&&r<=R){
lazy[x]^=1;
t[x]=(l-r+1)-t[x];
}else{
int mid=((l+r)>>1);
if(L<=mid){
update(x<<1,L,R,l,mid);
}
if(R>mid){
update(x<<1|1,L,R,mid+1,r);
}
pushup(x);
}
}
int query(int x,int L,int R,int l,int r){
pushdown(x,l,r);
if(L<=l&&r<=R){
return t[x];
}else{
int mid=((l+r)>>1);
int res=0;
if(L<=mid){
res+=query(x<<1,L,R,l,mid);
}
if(R>mid){
res+=query(x<<1|1,L,R,mid+1,r);
}
pushup(x);
return res;
}
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++){
a[i]=getchar()-'0';
}
build(1,1,n);
for(int i=1;i<=m;i++){
opt=read();
int left=read();
int right=read();
if(opt){
printf("%d\n",query(1,left,right,1,n));
}else{
update(1,left,right,1,n);
}
}
return 0;
}