#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300005;
int n, q;
bool on[MAXN];
pair<int, bool> tree[4 * MAXN];
#define ff first
#define ss second
pair<int, bool> merge(const pair<int, bool> &a, const pair<int, bool> &b)
{
return {max(a.ff, b.ff), a.ss && b.ss};
}
void build(int v, int l, int r)
{
if (l == r)
return void(tree[v] = {0, on[l]});
int m = (l + r) / 2;
build(2 * v, l, m);
build(2 * v + 1, m + 1, r);
tree[v] = merge(tree[2 * v], tree[2 * v + 1]);
}
void update(int v, int l, int r, int pos, pair<int, bool> val)
{
if (l == r)
{
on[pos] = val.ss;
return void(tree[v] = val);
}
int m = (l + r) / 2;
if (pos <= m)
update(2 * v, l, m, pos, val);
else
update(2 * v + 1, m + 1, r, pos, val);
tree[v] = merge(tree[2 * v], tree[2 * v + 1]);
}
pair<int, bool> query(int v, int tl, int tr, int l, int r)
{
if (l > r)
return {0, true};
if (l == tl and r == tr)
return tree[v];
int m = (tl + tr) / 2;
pair<int, bool> left = query(2 * v, tl, m, l, min(r, m));
pair<int, bool> right = query(2 * v + 1, m + 1, tr, max(l, m + 1), r);
return merge(left, right);
}
bool scan_ev()
{
char c;
scanf(" %c", &c);
if (c == 't')
{
for (int i = 0; i < 5; i++)
scanf(" %c", &c);
return true;
}
for (int i = 0; i < 4; i++)
scanf(" %c", &c);
return false;
}
int main()
{
scanf("%d%d", &n, &q);
char s[MAXN];
scanf(" %s", &s);
for (int i = 0; i < n; i++)
on[i] = s[i] - '0';
build(1, 0, n - 1);
int a, b, c;
for (int h = 1; h <= q; h++)
{
if (scan_ev())
{
scanf("%d", &c);
c--;
update(1, 0, n - 1, c, {h, !on[c]});
}
else
{
scanf("%d%d", &a, &b);
a--, b--;
pair<int, bool> res = query(1, 0, n - 1, a, b - 1);
printf("%d\n", (res.ss) ? h - res.ff : 0);
}
}
return 0;
}