#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define int long long
int a[maxn],book[maxn],sum[maxn];
int flagxor[maxn];
int bsize,n,m,op,x,y,kk;
string s;
inline int read(){
int f=1,k=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
k=k<<3 + k<<1 + c-'0';
c=getchar();
}
return f*k;
}
void changexor(int L,int R){
int e = min(R, book[L]*bsize);
for(int i=L; i<=e; i++){
if(a[i]==1) sum[book[L]]--;
else sum[book[L]]++;
a[i] ^= 1;
}
for(int i = book[L]+1; i<=book[R]-1; i++){
sum[i] = bsize-sum[i];
flagxor[i] = (flagxor[i] + 1) % 2;
}
if(book[L]!=book[R]){
for(int i = (book[R]-1)*bsize+1; i<=R; i++){
if(a[i]==1) sum[book[i]]--;
else sum[book[i]]++;
a[i] ^= 1;
}
}
}
int query_add(int L,int R){
int res=0;
int e=min(R,book[L]*bsize);
for(int i=L;i<=e;i++){
res+=(a[i]^flagxor[book[i]]);
}
for(int i=book[L]+1;i<=book[R]-1;i++){
res+=sum[i];
}
if(book[L]!=book[R]){
for(int i=(book[R]-1)*bsize+1;i<=R;i++){
res+=(a[i]^flagxor[book[i]]);
}
}
return res;
}
signed main(){
cin >> n >> m;
bsize=sqrt(n);
for(int i=1;i<=n;i++){
book[i]=(i-1)/bsize+1;
}
for(int i=1;i<=n;i++){
sum[book[i]]=0;
}
cin >> s;
for(int i=1;i<=n;i++){
a[i]=s[i-1]-'0';
sum[book[i]]+=a[i];
}
while(m--){
cin >> op;
if(op==0){
cin >> x >> y;
changexor(x,y);
}
else{
cin >> x >> y;
cout << query_add(x,y) << '\n';
}
}
return 0;
}
过了样例和测试点1,后面全wa