#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)a[i]=read()
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
int read() {
char ch=getchar();
int r=0,w=1;
while(ch<'0'||ch>'9') w=ch=='-'?-1:w,ch=getchar();
while(ch>='0'&&ch<='9') r=r*10+ch-'0',ch=getchar();
return r*w;
}
CI N=2e5+5;
int n;
std::string s;
unsigned long long p[N];
struct Splay {
int rt,tot,fa[N],ch[N][2],val[N],size[N];
unsigned long long hash[N];
void maintain(int x) {size[x]=size[ch[x][0]]+size[ch[x][1]]+1;hash[x]=hash[ch[x][0]]+(unsigned long long)val[x]*p[size[ch[x][0]]]+hash[ch[x][1]]*p[size[ch[x][0]]+1];}
int find_dir(int x) {return x==ch[fa[x]][1];}
void del(int x) {fa[x]=ch[x][0]=ch[x][1]=val[x]=size[x];}
void rotate(int k) {
int y=fa[k],z=fa[y],op=find_dir(k);
ch[y][op]=ch[k][!op];
if(ch[k][!op]) {
fa[ch[k][!op]]=y;
}
ch[k][!op]=y;
fa[y]=k;
fa[k]=z;
if(z) {
ch[z][y==ch[z][1]]=k;
}
maintain(y);
maintain(k);
}
void splay(int k,int goal=0) {
for(int f=fa[k];f=fa[k],f!=goal;rotate(k)) if(fa[f]!=goal) rotate(find_dir(f)==find_dir(k)?f:k);
if(!goal) rt=k;
}
int find(int x) {
int k=rt;
while(1) {
if(x==size[ch[k][0]]+1) return k;
if(x<=size[ch[k][0]]) k=ch[k][0];
else x-=size[ch[k][0]]+1,k=ch[k][1];
}
}
int alloc(int v,int f) {
fa[++tot]=f,size[tot]=1;
val[tot]=hash[tot]=v;
return tot;
}
void insert(int x,int v) {
if(!rt) {
rt=alloc(v,0);
return ;
}
int k=find(x);
splay(k,0);
if(!ch[k][1]) {
ch[x][1]=alloc(v,k);
maintain(k);
return ;
} else {
k=find(x+1);
splay(k,rt);
ch[k][0]=alloc(v,k);
maintain(k);
maintain(rt);
return ;
}
}
int query_hash(int l,int r) {
int L=find(l),R=find(r);
splay(L,0);
if(l==r) return val[L];
splay(R,L);
return hash[ch[R][0]] * p[1] + val[R] + val[rt] * p[size[ch[R][0]] + 1];
}
}tr;
signed main() {
std::cin>>s;
n=s.size();
s=" "+s;
p[0]=1;
rep(i,1,2*n) p[i]=p[i-1]*233;
rep(i,1,n) {
tr.insert(i-1,s[i]-'a'+1);
}
int q=read();
while(q--) {
char op[2];
scanf("%s",op);
int x=read();
if(op[0]=='Q') {
int y=read();
if(x>y) std::swap(x,y);
int l=0,r=n-y+1,ans=0;
while(l<=r) {
int mid=l+r+1>>1;
if(tr.query_hash(x,x+mid-1)==tr.query_hash(y,y+mid-1)) l=mid+1,ans=mid;
else r=mid-1;
}
std::cout<<ans<<"\n";
} else if(op[0]=='R') {
char ch[2];
scanf("%s",ch);
int k=tr.find(x);
tr.splay(k);
tr.val[k]=ch[0]-'a'+1;
tr.maintain(k);
} else {
char ch[2];
scanf("%s",ch);
tr.insert(x,ch[0]-'a'+1);
n++;
}
}
return 0;
}