#include<bits/stdc++.h>
#define N 100005
using namespace std;
typedef unsigned long long ull;
ull mi[N*5], key[N*5], val[N*5];
int son[N*5][2], siz[N*5], f[N*5], rootd, notd, n;
char s[N];
int get(int x) {
return (son[f[x]][1] == x);
}
int New(ull num) {
key[++notd] = val[notd] = num; siz[notd] = 1;
return notd;
}
void update(int x) {
if (!x) return;
int lson = son[x][0], rson = son[x][1];
key[x] = key[lson]*mi[siz[rson]+1]+val[x]*mi[siz[rson]]+key[rson];
siz[x] = siz[lson]+1+siz[rson];
}
void rotate(int &x) {
int fa = f[x], fafa = f[fa]; int num = get(x);
son[fa][num] = son[x][num^1]; f[son[fa][num]] = fa;
son[x][num^1] = fa; f[fa] = x; f[x] = fafa;
if (fafa) son[fafa][son[fafa][1] == fa] = x;
update(fa); update(x);
}
void splay(int x, int y) {
int fa = f[x];
for (; fa != y; fa = f[x]) {
if (f[fa] != y) rotate((get(fa) == get(x)) ? fa : x);
rotate(x);
}
if (!y) rootd = x;
}
int Build(int l, int r, int fa) {
if (l > r) { return 0; }
if (l == r) { key[l] = val[l]; f[l] = fa, siz[l] = 1; return l; }
int mid = (l + r)>>1;
f[mid] = fa;
son[mid][0] = Build(l, mid - 1, mid);
son[mid][1] = Build(mid + 1, r, mid);
update(mid);
return mid;
}
int GetRanknumID(int now, int x) {
int cdp = (son[now][0] ? siz[son[now][0]] : 0);
if (x <= cdp) return GetRanknumID(son[now][0], x);
else {
if (x == cdp+1) return now;
return GetRanknumID(son[now][1], x-(cdp+1));
}
return 0;
}
void work(int x, int y) {
int len1 = siz[rootd]-2;
int L = 1, R = min(len1-x+1, len1-y+1), ans = 0;
int orz1, odp1, orz2, odp2;
ull num1, num2;
while (L <= R) {
int mid = (L+R)>>1;
orz1 = GetRanknumID(rootd, x+1-1);
odp1 = GetRanknumID(rootd, x+1+mid-1+1);
splay(orz1, 0); splay(odp1, orz1);
num1 = key[son[odp1][0]];
orz2 = GetRanknumID(rootd, y+1-1);
odp2 = GetRanknumID(rootd, y+1+mid-1+1);
splay(orz2, 0); splay(odp2, orz2);
num2 = key[son[odp2][0]];
if (num1 == num2) ans = mid, L = mid+1; else R = mid-1;
}
printf("%d\n", ans);
}
int main() {
freopen("10.in", "r", stdin);
freopen("data.out", "w", stdout);
mi[0] = 1; for (int i = 1; i <= 500000; i++) mi[i] = 131ull*mi[i-1];
scanf("%s", s+1); int slen = strlen(s+1);
val[1] = 0; for (int i = 2; i <= slen+1; i++) val[i] = s[i-1]-'a'; val[slen+2] = 0;
rootd = Build(1, slen+2, 0); notd = slen+2;
int x, y; char opt[10], d[10];
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", opt+1);
if (opt[1] == 'Q') scanf("%d%d", &x, &y), work(x, y);
if (opt[1] == 'R') {
scanf("%d", &x); scanf("%s", d+1);
int orz1 = GetRanknumID(rootd, x+1);
splay(orz1, 0);
val[orz1] = d[1]-'a'; update(orz1);
}
if (opt[1] == 'I') {
scanf("%d", &x); scanf("%s", d+1);
int orz1 = GetRanknumID(rootd, x+1);
int orz2 = GetRanknumID(rootd, x+2);
splay(orz1, 0); splay(orz2, orz1);
son[orz2][0] = New(d[1]-'a'); f[son[orz2][0]] = orz2;
update(orz2); update(orz1);
}
}
return 0;
}