#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int n,m;
struct E_tree{
#define ls(p) p<<1
#define rs(p) p<<1|1
int sum0[N<<2],sum1[N<<2],lz[N<<2];
void push_up(int p){
sum0[p]=sum0[ls(p)]+sum0[rs(p)];
sum1[p]=sum1[ls(p)]+sum1[rs(p)];
}
void ad(int p){
swap(sum0[p],sum1[p]);
lz[p]^=1;
}
void push_down(int p){
if(!lz[p])return;
ad(ls(p));
ad(rs(p));
lz[p]=0;
}
void build(int p,int l,int r){
if(l==r){
int k;
scanf("%1d",&k);
if(k)sum1[p]=1;
else sum0[p]=1;
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void add(int p,int l,int r,int x,int y){
if(l>y||r<x)return;
if(x<=l&&r<=y){
ad(p);
return;
}
push_down(p);
int mid=l+r>>1;
add(ls(p),l,mid,x,y);
add(rs(p),mid+1,r,x,y);
push_up(p);
}
int ask(int p,int l,int r,int x,int y){
if(l>y||r<x)return 0;
if(x<=l&&r<=y)return sum1[p];
push_down(p);
int mid=l+r>>1;
return ask(ls(p),l,mid,x,y)+ask(rs(p),mid+1,r,x,y);
}
}T;
int main()
{
scanf("%d%d",&n,&m);
T.build(1,1,n);
int o,x,y;
while(m--)
{
scanf("%d%d%d",&o,&x,&y);
if(o==1)
printf("%d\n",T.ask(1,1,n,x,y));
else T.add(1,1,n,x,y);
}
return 0;
}