code:
#include <bits/stdc++.h>
#define R register
#define inl inline
#define fastios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define Debug(file) freopen(file".in","r",stdin);freopen(file".out","w",stdout);
using namespace std;
const int N = 2e5 + 5;
int n,m,op,l,r;
int a[N];
struct node{
int l,r,sum,lazy;
}tr[N<<2];
void pushup(int u){
tr[u].sum = tr[u<<1].sum + tr[u<<1|1].sum;
}
void pushdown(int u){
node &l = tr[u<<1],&r = tr[u<<1|1];
l.sum = (l.r - l.l + 1)-l.sum,l.lazy ++;
r.sum = (r.r - r.l + 1)-r.sum,r.lazy ++;
tr[u].lazy = 0;
}
void build(int u,int l,int r){
if(l==r)tr[u]={l,r,0,0};
else {
const int mid = l + r >> 1;
tr[u].l = l,tr[u].r = r;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modify(int u,int l,int r){
if(tr[u].l <= l && r <= tr[u].r){
tr[u].sum = (tr[u].r - tr[u].l + 1)-tr[u].sum;
tr[u].lazy ++;
}else{
pushdown(u);
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(l <= tr[u].l && tr[u].r <= r){
return tr[u].sum;
}else{
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
int ans = 0;
if(l <= mid)ans = query(u<<1,l,r);
if(r > mid)ans += query(u<<1|1,l,r);
return ans;
}
}
int main() {
cin >> n >> m;
char s[N]={};
scanf("%s",s);
for(int i = 0;i < n;i ++)a[i] = s[i]-'0';
build(1,1,n);
while(m--){
cin >> op >> l >> r;
if(op){
cout << query(1,l,r) << endl;
}else{
modify(1,l,r);
}
}
return 0;
}