#include <bits/stdc++.h>
using namespace std;
struct segtree_t {
int n; vector<long long> segtree; vector<int> A;
segtree_t() : n(0),segtree(),A() {}
segtree_t(segtree_t x,segtree_t y) : n(0),segtree(),A() {
merge(x.A.begin(),x.A.end(),y.A.begin(),y.A.end(),back_inserter(A));
A.erase(unique(A.begin(),A.end()),A.end());
n = A.size(),segtree.assign(2*n,0);
}
void build(){
sort(A.begin(),A.end()),A.erase(unique(A.begin(),A.end()),A.end());
n = A.size(),segtree.assign(2*n,0);
}
void push(int x){
A.emplace_back(x);
}
void add(int l,int r,int a){
int ll = lower_bound(A.begin(),A.end(),l)-A.begin();
int rr = lower_bound(A.begin(),A.end(),r)-A.begin();
for (ll+=n,rr+=n;ll < rr;ll>>=1,rr>>=1){
if (ll&1) segtree[ll++] += a;
if (rr&1) segtree[--rr] += a;
}
}
long long get(int x){
int ret = 0;
for (int l(lower_bound(A.begin(),A.end(),x)-A.begin()+n);l;l>>=1) ret += segtree[l];
return ret;
}
};
int main(){
ios::sync_with_stdio(false),cin.tie(0);
int n,q; cin >> n >> q; string s; cin >> s; char flip = '0'^'1';
set<pair<int,int>> S;
vector<segtree_t> segtree(2*n);
vector<pair<int,int>> Q(q);
for (auto& [a,b]:Q){
string s; cin >> s; b = -1;
if (s=="toggle") (cin >> a),--a;
else (cin>>a>>b),--a,--b,segtree[n+a].push(b);
}
for (int i(0);i < n;++i) segtree[n+i].build();
for (int i(n-1);i;--i) segtree[i] = segtree_t(segtree[i<<1],segtree[i<<1|1]);
for (int i(0);i < n;++i) if (s[i]=='1'){
int x = i; while(i+1<n&&s[i+1]=='1') ++i;
S.emplace(i,x);
//cout << x << ' ' << i << ' ' << x << ' ' << i+1 << ' ' << q << endl;
for (int l(n+x),r(n+i+1);l < r;l>>=1,r>>=1){
if (l&1) segtree[l++].add(x,i+2,q);
if (r&1) segtree[--r].add(x,i+2,q);
}
}
for (int i(0);auto& [a,b]:Q){
if (b==-1){
auto it = S.lower_bound(make_pair(a,0));
if (s[a]=='1'){
for (int l(n+it->second),r(n+a+1);l < r;l>>=1,r>>=1){
if (l&1) segtree[l++].add(a+1,it->first+2,-(q-i-1));
if (r&1) segtree[--r].add(a+1,it->first+2,-(q-i-1));
}
if (a!=it->second) S.emplace(a-1,it->second);
if (a!=it->first) S.emplace(it->first,a+1);
S.erase(it);
} else {
int l = a,r = a;
if (it!=S.end()&&it->second==a+1) r = it->first,it=S.erase(it);
if (it!=S.begin()&&prev(it)->first==a-1) l = prev(it)->second,S.erase(prev(it));
S.emplace_hint(it,make_pair(r,l));
for (int ll(n+l),rr(n+a+1);ll < rr;ll>>=1,rr>>=1){
if (ll&1) segtree[ll++].add(a+1,r+2,q-i-1);
if (rr&1) segtree[--rr].add(a+1,r+2,q-i-1);
}
}
s[a] ^= flip;
} else {
long long res = 0;
for (int l(n+a);l;l>>=1) res += segtree[l].get(b);
auto it = S.lower_bound(make_pair(a,0));
if (it!=S.end()&&it->first+1>=b&&it->second<=a) res -= q-i-1;
cout << res << '\n';
}
++i;
}
}