#include<bits/stdc++.h>
#define i64 int64_t
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const i64 BASE=131,MOD=998244353;
const int N=3e5+5;
mt19937 rnd(time(0));
string s;
i64 P[N];
int n,q;
struct FHQ
{
int sz[N],l[N],r[N],pr[N],rt,cnt;
i64 val[N],hs[N];
FHQ(){rt=cnt=0;}
void upd(int x)
{
sz[x]=sz[l[x]]+sz[r[x]]+1;
hs[x]=((hs[l[x]]*P[sz[r[x]]+1]%MOD+val[x]*P[sz[r[x]]]%MOD)%MOD+hs[r[x]])%MOD;
}
pii split(int u,int k)
{
if(!u) return {0,0};
int x,y,rk=sz[l[u]]+1;
if(rk<=k)
{
x=u;
pii tmp=split(r[u],k-rk);
y=tmp.se,r[x]=tmp.fi;
}
else
{
y=u;
pii tmp=split(l[u],k);
x=tmp.fi,l[y]=tmp.se;
}
upd(u);
return {x,y};
}
int merge(int x,int y)
{
if(!x||!y) return x|y;
int ans;
if(pr[x]<pr[y])
{
r[x]=merge(r[x],y);
ans=x,upd(x);
}
else
{
l[y]=merge(x,l[y]);
ans=y,upd(y);
}
return ans;
}
int create(int v)
{
val[++cnt]=hs[cnt]=v;
pr[cnt]=rnd();
l[cnt]=r[cnt]=0;
sz[cnt]=1;
return cnt;
}
void ins(int v,int k)
{
pii tmp=split(rt,k);
rt=merge(merge(tmp.fi,create(v)),tmp.se);
}
void updv(int v,int k)
{
pii tmp=split(rt,k);
pii TMP=split(tmp.fi,k-1);
val[TMP.se]=hs[TMP.se]=v;
rt=merge(merge(TMP.fi,TMP.se),tmp.se);
}
i64 get(int l,int r)
{
pii tmp=split(rt,r);
pii TMP=split(tmp.fi,l-1);
i64 res=hs[TMP.se];
rt=merge(merge(TMP.fi,TMP.se),tmp.se);
return res;
}
}T;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
P[0]=1;
for(int i=1;i<=N-5;i++)
P[i]=P[i-1]*BASE%MOD;
cin>>s;n=s.size();
for(int i=0;i<n;i++)
T.ins(s[i]-'a',i+1);
cin>>q;
while(q--)
{
char op;cin>>op;
if(op=='R')
{
int x;char d;
cin>>x>>d;
T.updv(d-'a',x);
}
else if(op=='I')
{
int x;char d;
cin>>x>>d;
T.ins(d-'a',x);
}
else
{
int x,y,res=0;cin>>x>>y;
if(x>y) swap(x,y);
for(int i=20;~i;i--)
{
int nw=res+(1<<i);
if(y+nw-1>T.sz[T.rt]) continue;
if(T.get(x,x+nw-1)==T.get(y,y+nw-1)) res=nw;
}
cout<<res<<"\n";
}
}
return 0;
}