#include <bits/stdc++.h>
using namespace std;
using ui = unsigned int;
const ui N = 2e5 + 5;
const ui b = 114;
mt19937 rd(114514);
ui bpow[N];
namespace FHQTreap
{
ui hs[N];
ui sz[N];
ui ls[N], rs[N], val[N];
ui pri[N];
ui rt = 0, cnt = 0;
inline void update(ui x)
{
sz[x] = sz[ls[x]] + sz[rs[x]] + 1;
hs[x] = hs[ls[x]] * bpow[sz[rs[x]] + 1] + val[x] * bpow[sz[rs[x]]] + hs[rs[x]];
}
inline ui addn(int v = 0)
{
val[++cnt] = v;
pri[cnt] = rd();
hs[cnt] = v;
return cnt;
}
inline ui merge(ui x, ui y)
{
if (!x || !y)
return x | y;
if (pri[x] < pri[y])
{
rs[x] = merge(rs[x], y);
update(x);
return x;
}
else
{
ls[y] = merge(x, ls[y]);
update(y);
return y;
}
}
inline void split(ui u, ui k, ui &x, ui &y)
{
if (!u)
return x = y = 0, void();
if (sz[ls[u]] < k)
{
x = u;
split(rs[u], k - sz[ls[u]] - 1, rs[u], y);
update(x);
}
else
{
y = u;
split(ls[u], k, x, ls[u]);
update(y);
}
update(u);
}
inline void insert(ui pos, ui va)
{
ui x, y;
split(rt, pos, x, y);
rt = merge(merge(x, addn(va)), y);
}
inline void replace(ui pos, ui va)
{
ui x, y, z;
split(rt, pos, x, z);
split(x, pos - 1, x, y);
hs[y] = val[y] = va;
rt = merge(merge(x, y), z);
}
inline ui geths(ui l, ui r)
{
ui x, y, z;
split(rt, r, x, z);
split(x, l - 1, x, y);
ui ans = hs[y];
rt = merge(merge(x, y), z);
return ans;
}
}
inline ui solve(ui l, ui r, ui len)
{
if (l > r)
swap(l, r);
ui L = 1, R = len - r + 1;
while (L <= R)
{
ui m = (L + R) >> 1;
if (FHQTreap::geths(l, l + m - 1) == FHQTreap::geths(r, r + m - 1))
L = m + 1;
else
R = m - 1;
}
return L - 1;
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
bpow[0] = 1;
for (ui i = 1; i < N; i++)
bpow[i] = bpow[i - 1] * b;
string s;
cin >> s;
ui len = s.size();
for (ui i = 0; i < len; i++)
FHQTreap::insert(i, s[i] - 'a' + 1);
ui m;
cin >> m;
while (m--)
{
char op, x;
ui l, r;
cin >> op;
if (op == 'Q')
{
cin >> l >> r;
cout << solve(l, r, len) << '\n';
}
else if (op == 'R')
{
cin >> l >> x;
FHQTreap::replace(l, x - 'a' + 1);
}
else
{
cin >> l >> x;
len++;
FHQTreap::insert(l, x - 'a' + 1);
}
}
return 0;
}