#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int base=233;
const int mod1=1e9+7;
const int mod2=1e9+9;
const int maxn=1e5+9;
struct node
{
int fir,sec;
};
ll p[maxn];
struct NODE
{
ll hs;
int l,r,rnd,size;
char c;
}t[maxn];
void update(int x)
{
t[x].size=t[t[x].l].size+t[t[x].r].size+1;
t[x].hs=((t[t[x].l].hs+(t[x].c*p[t[t[x].l].size]))+(t[t[x].r].hs*p[(t[t[x].l].size+1)]));
}
int cnt,root;
int new_node(int v)
{
t[++cnt].c=v;
t[cnt].rnd=rand();
t[cnt].size=1;
t[cnt].hs=v;
return cnt;
}
node split(int a,int k)
{
if(!a)return {0,0};
if(t[t[a].l].size>=k)
{
node now=split(t[a].l,k);
t[a].l=now.sec;
update(a);
return {now.fir,a};
}
else
{
node now=split(t[a].r,k-t[t[a].l].size-1);
t[a].r=now.fir;
update(a);
return {a,now.sec};
}
}
int merge(int a,int b)
{
if(!a||!b)return a+b;
if(t[a].rnd<t[b].rnd)
{
t[b].l=merge(a,t[b].l);
update(b);
return b;
}
else
{
t[a].r=merge(t[a].r,b);
update(a);
return a;
}
}
bool check(int r,int x,int y)
{
node now1=split(root,x-1);
node now2=split(now1.sec,r);
ll a=t[now2.fir].hs;
root=merge(merge(now1.fir,now2.fir),now2.sec);
now1=split(root,y-1);
now2=split(now1.sec,r);
ll b=t[now2.fir].hs;
root=merge(merge(now1.fir,now2.fir),now2.sec);
return a==b;
}
signed main()
{
p[0]=1;
for(int i=1;i<=1e5;i++)
{
p[i]=p[i-1]*base;
}
string s;
cin>>s;
for(int i=0;s[i];i++)
{
node now=split(root,i);
root=merge(merge(now.fir,new_node(s[i])),now.sec);
}
int m;
scanf("%d",&m);
while(m--)
{
char opt;
cin>>opt;
if(opt=='Q')
{
int x,y;
scanf("%d%d",&x,&y);
int ans=0;
int l=0,r=cnt;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid,x,y))
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
printf("%d\n",ans);
}
else if(opt=='R')
{
int x;
char d;
cin>>x>>d;
node now1=split(root,x);
node now2=split(now1.fir,x-1);
t[now2.sec].c=d;t[now2.sec].hs=d;
root=merge(merge(now2.fir,now2.sec),now1.sec);
}
else
{
int x;
char d;
cin>>x>>d;
node now=split(root,x);
root=merge(merge(now.fir,new_node(d)),now.sec);
}
}
}