#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#define maxn 200005
#define ull unsigned long long
using namespace std;
int len,n,base=137,sz[maxn],son[maxn][2],root,rd[maxn];
ull mul[maxn]={1},Hash[maxn],val[maxn];
void pushup(int id)
{
Hash[id]=Hash[son[id][0]]+val[id]*mul[sz[son[id][0]]]+Hash[son[id][1]]*mul[sz[son[id][0]]+1];
sz[id]=sz[son[id][0]]+sz[son[id][1]]+1;
}
void split(int id,int rk,int &x,int &y)
{
if(id==0)
{
x=y=0;
return;
}
if(sz[son[id][0]]>=rk)
{
y=id;
split(son[id][0],rk,x,son[y][0]);
}
else
{
x=id;
split(son[id][1],rk-sz[son[id][0]]-1,son[x][1],y);
}
pushup(id);
}
int merge(int x,int y)
{
if(x==0 || y==0) return x+y;
if(rd[x]<rd[y])
{
son[x][1]=merge(son[x][1],y);
pushup(x);
return x;
}
else
{
son[y][0]=merge(x,son[y][0]);
pushup(y);
return y;
}
}
int get_hash(int x,int l)
{
int A,B,C;
split(root,x-1,A,B);
split(B,l,B,C);
int ret=Hash[B];
root=merge(merge(A,B),C);
return ret;
}
int get_ans(int x,int y)
{
int l=0,r=len-max(x,y)+1,mid,ret=0;
while(l<=r)
{
int mid=(l+r)/2;
if(get_hash(x,mid)==get_hash(y,mid))
{
l=mid+1;
ret=max(ret,mid);
}
else r=mid-1;
}
return ret;
}
int main()
{
string s;
for(int i=1;i<=15e4;i++) mul[i]=mul[i-1]*base;
cin>>s;
len=s.size();
for(int i=0;i<s.size();i++)
{
Hash[i+1]=val[i+1]=s[i]-'a'+1;
sz[i+1]=1;
rd[i+1]=rand()*rand();
root=merge(root,i+1);
}
scanf("%d",&n);
int x,y;
char opt,d;
for(int i=1;i<=n;i++)
{
cin>>opt;
scanf("%d",&x);
if(opt=='Q')
{
scanf("%d",&y);
printf("%d\n",get_ans(x,y));
}
if(opt=='R')
{
int A,B,C;
cin>>d;
split(root,x-1,A,B);
split(B,x,B,C);
Hash[B]=val[B]=d-'a'+1;
root=merge(merge(A,B),C);
}
if(opt=='I')
{
cin>>d;
int A,B;
split(root,x,A,B);
Hash[++len]=d-'a'+1;
val[len]=Hash[len];
sz[len]=1;
rd[len]=rand()*rand();
root=merge(merge(A,len),B);
}
}
return 0;
}