#include<bits/stdc++.h>
using namespace std;
const int N=200007;
inline int read()
{
int sum=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
sum=(sum<<1)+(sum<<3)+(c^48);
c=getchar();
}
return sum*f;
}
char c;
int w[N],n,m,x,y,z;
struct node
{
int l,r;
int sum,add;
}tr[N<<2];
void pushup(int u)
{
tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum);
}
void pushdown(int u)
{
node &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];
if(root.add)
{
left.add^=1;
if(left.add)left.sum=(left.r-left.l+1)-left.sum;
right.add^=1;
if(right.add)right.sum=(right.r-right.l+1)-right.sum;
root.add=0;
}
}
void build(int u,int l,int r)
{
if(l==r)tr[u]={l,r,w[r],0};
else
{
tr[u]={l,r};
int mid=tr[u].l+tr[u].r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modify(int u,int l,int r)
{
pushdown(u);
if(tr[u].l>=l&&tr[u].r<=r)
{
tr[u].sum=r-l+1-tr[u].sum;
tr[u].add^=1;
}
else
{
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)modify(u<<1,l,r);
if(r>mid)modify(u<<1|1,l,r);
pushup(u);
}
}
int query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].sum;
int mid=tr[u].l+tr[u].r>>1,res=0;
pushdown(u);
if(l<=mid)res=query(u<<1,l,r);
if(r>mid)res+=query(u<<1|1,l,r);
return res;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++){
cin>>c;
w[i]=c-'0';
}
build(1,1,n);
while(m--){
x=read(),y=read(),z=read();;
if(x==0)modify(1,y,z);
else cout<<query(1,y,z)<<endl;
}
return 0;
}
离谱,样例都没过。。。