#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
int n, q;
vector<pair<int, int>> st[600005];
string s;
vector<pair<int, int>> mg(const vector<pair<int, int>> &l, const vector<pair<int, int>> &r) {
vector<pair<int, int>> ret;
for (int i = 0, j = 0; i < l.size() && j < r.size(); i++) {
while (j < r.size() && r[j].second < l[i].first) j++;
while (j < r.size() && r[j].second >= l[i].first && l[i].second >= r[j].first) {
ret.emplace_back(max(l[i].first, r[j].first), min(l[i].second, r[j].second));
j++;
}
}
return ret;
}
vector<pair<int, int>> query(int l, int r) {
vector<pair<int, int>> ret = {{1, inf}};
for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
if (l&1) ret = std::move(mg(ret, st[l++]));
if (r&1) ret = std::move(mg(ret, st[--r]));
}
return ret;
}
void update(int i, int t) {
i += n;
if (st[i].empty() || st[i].back().second != inf) {
for (; i >= 1; i >>= 1) {
st[i].emplace_back(t+1, inf);
if (st[i^1].empty() || st[i^1].back().second <= t) break;
}
} else {
for (; i >= 1; i >>= 1) if (!st[i].empty()) st[i].back().second = min(st[i].back().second, t);
}
}
void dbg() {
for (int i = 1; i < 2*n; i++) {
cout << i << ": ";
for (auto [l, r]: st[i]) cout << l << ' ' << r << ' ';
cout << '\n';
}
cout << "===============\n";
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> q >> s;
for (int i = 0; i < n; i++) if (s[i] == '1') st[i+n].emplace_back(1, inf);
for (int i = n-1; i >= 0; i--) st[i] = std::move(mg(st[i<<1], st[i<<1|1]));
for (int t = 1; t <= q; t++) {
cin >> s;
if (s == "query") {
int a, b; cin >> a >> b;
a--, b--;
auto v = std::move(query(a, b));
int ans = 0;
for (auto [l, r]: v) ans += min(t, r) - l + 1;
cout << ans << '\n';
// dbg();
} else {
int u; cin >> u;
u--;
update(u, t);
}
}
}