#include<bits/stdc++.h>
using namespace std;
#define reg register
#define gc getchar()
typedef long long ll;
inline ll read(){
reg ll res = 0, k = 1;
reg char ch = gc;
while(ch < '0' || ch > '9'){
if(ch == '-')
k = -1;
ch = gc;
}
while(ch >= '0' && ch <= '9'){
res = res * 10 + ch - '0';
ch = gc;
}
return res * k;
}
int n, m;
int s[200000 + 5];
int tree[200000 * 4 + 5];
bool del[200000 * 4 + 5];
inline void build(int id, int l, int r){
if(l == r){
tree[id] = s[l];
return;
}
reg int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
tree[id] = tree[id << 1] + tree[id << 1 | 1];
}
inline void lazy(int id, int l, int r){
if(del[id]){
int mid = (l + r) >> 1;
tree[id << 1] = mid - l + 1 - tree[id << 1];
tree[id << 1 | 1] = r - mid - tree[id << 1 | 1];
del[id] = 0;
del[id << 1] ^= 1;
del[id << 1 | 1] ^= 1;
}
}
inline void change(int id, int l, int r, int ml, int mr){
if(ml <= l && r <= mr){
del[id] ^= 1;
tree[id] = r - l + 1 - tree[id];
return;
}
if(r < ml || l > mr)
return;
lazy(id, l, r);
int mid = (l + r) >> 1;
change(id << 1, l, mid, ml, mr);
change(id << 1 | 1, mid + 1, r, ml, mr);
tree[id] = tree[id << 1] + tree[id << 1 | 1];
}
inline int query(int id, int l, int r, int ml, int mr){
if(ml <= l && r <= mr)
return tree[id];
if(r < ml || l > mr)
return 0;
lazy(id, l, r);
int mid = (l + r) >> 1;
return query(id << 1, l, mid, ml, mr) + query(id << 1 | 1, mid + 1, r, ml, mr);
}
int main(){
n = read(), m = read();
for(reg int i = 1; i <= n ; ++i)
s[i] = gc - '0';
build(1, 1, n);
while(m--){
reg int op = read(), l = read(), r = read();
if(op)printf("%d\n",query(1, 1, n, l, r));
else change(1, 1, n, l, r);
}
return 0;
}