#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct Node{
int l,r,len;
long long sum;
bool lazy;
}a[N*4];
int n,m,ans;
char s[N];
void bulid(int x,int l,int r){
a[x].l=l;
a[x].r=r;
a[x].len=r-l+1;
if(l==r){
a[x].sum=(int)(s[l]-'0');
return;
}
int mid=(l+r)/2;
bulid(x*2,l,mid);
bulid(x*2+1,mid+1,r);
a[x].sum=a[x*2].sum+a[x*2+1].sum;
}
void tagdown(int x,int len){
if(a[x].lazy){
a[x*2].lazy^=1;
a[x*2+1].lazy^=1;
a[x*2].sum=(len-(len/2))-a[x*2].sum;
a[x*2+1].sum=(len/2)-a[x*2+1].sum;
a[x].lazy=0;
}
}
long long ask(int x,int l,int r){
if(l<=a[x].l&&a[x].r<=r){
return a[x].sum;
}
tagdown(x,a[x].len);
int mid=(a[x].l+a[x].r)>>1;
long long t=0;
if(l<=mid){
t+=ask(x*2,l,r);
}
if(r>mid){
t+=ask(x*2+1,l,r);
}
return t;
}
void change(int x,int l,int r){
tagdown(x,r-l+1);
if(l<=a[x].l&&a[x].r<=r){
a[x].sum=a[x].len-a[x].sum;
a[x].lazy^=1;
return;
}
tagdown(x,r-l+1);
int mid=(a[x].l+a[x].r)>>1;
if(l<=mid){
change(x*2,l,r);
}
if(mid<r){
change(x*2+1,l,r);
}
a[x].sum=a[x*2].sum+a[x*2+1].sum;
}
int main(){
cin>>n>>m;
scanf("%s",s+1);
bulid(1,1,n);
int op,x,y,z;
while(m--){
scanf("%d%d%d",&op,&x,&y);
if(op==0){
change(1,x,y);
}
else{
printf("%lld\n",ask(1,x,y));
}
}
return 0;
}
rt,一些之前经常犯的错误都查过一边了