#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXT 400000
#define MAXN 210000
unsigned int mi[MAXN];
struct Splay_tree
{
int ch[MAXT][2],pnt[MAXT],val[MAXT],siz[MAXT];
unsigned int hs[MAXT];
int root;
int topt;
void update(int now)
{
siz[now]=siz[ch[now][0]]+siz[ch[now][1]]+1;
hs[now]=hs[ch[now][0]] + val[now]*mi[siz[ch[now][0]]] + hs[ch[now][1]]*(mi[siz[ch[now][0]]+1]);
}
void rotate(int now)
{
int p=pnt[now],anc=pnt[p];
int dir=(ch[p][0]==now);
if (anc)ch[anc][ch[anc][1]==p]=now;
pnt[now]=anc;
pnt[ch[now][dir]]=p;
ch[p][1-dir]=ch[now][dir];
pnt[p]=now;
ch[now][dir]=p;
update(p);
update(now);
}
void splay(int now,int tp=0)
{
while (now!=tp && pnt[now]!=tp)
{
int p=pnt[now],anc=pnt[p];
if (anc==tp)
{
rotate(now);
}else
{
if((ch[anc][0]==p) == (ch[p][0]==now))
rotate(p),rotate(now);
else
rotate(now),rotate(now);
}
}
if (!tp)
root=now;
return ;
}
int get_kth(int now,int rk)
{
if (!now)return -1;
if (siz[ch[now][0]]+1==rk)
return now;
else if (siz[ch[now][0]]+1<rk)
return get_kth(ch[now][1],rk-siz[ch[now][0]]-1);
else return get_kth(ch[now][0],rk);
}
void insert(int pos,int v)
{
if (!root)
{
root=++topt;
val[topt]=v;
pnt[topt]=0;
update(topt);
return ;
}
if (!pos)
{
splay(get_kth(root,1),0);
ch[root][0]=++topt;
ch[topt][0]=ch[topt][1]=0;
val[topt]=v;
pnt[topt]=root;
update(topt);
update(root);
return ;
}
splay(get_kth(root,pos));
if (pos+1<=siz[root])
splay(get_kth(root,pos+1),root);
//scan(root);
if (!ch[root][1])
{
ch[root][1]=++topt;
pnt[topt]=root;
}else
{
ch[ch[root][1]][0]=++topt;
pnt[topt]=ch[root][1];
}
ch[topt][0]=ch[topt][1]=0;
val[topt]=v;
update(topt);
if (ch[root][1]!=topt)
update(ch[root][1]);
update(root);
}
void change_val(int pos,int v)
{
splay(get_kth(root,pos));
val[root]=v;
update(root);
}
unsigned int query(int l,int r)
{
if (l==1 && r==siz[root])
{
// scan(root);
return hs[root];
}else if (l==1)
{
splay(get_kth(root,r+1));
// scan(ch[root][0]);printf("\n");
return hs[ch[root][0]];
}else if (r==siz[root])
{
splay(get_kth(root,l-1));
// scan(ch[root][1]);printf("\n");
return hs[ch[root][1]];
}else
{
splay(get_kth(root,r+1));
splay(get_kth(root,l-1),root);
// scan(ch[ch[root][0]][1]);printf("\n");
return hs[ch[ch[root][0]][1]];
}
}
void scan(int now)
{
if (!now)
return ;
if (ch[now][0] && pnt[ch[now][0]]!=now)throw 1;
if (ch[now][1] && pnt[ch[now][1]]!=now)throw 1;
if (siz[now]!=siz[ch[now][0]]+siz[ch[now][1]]+1)throw 1;
if (hs[now]!=hs[ch[now][0]]+val[now]*mi[siz[ch[now][0]]]+hs[ch[now][1]]*(mi[siz[ch[now][0]]+1]))throw 1;
scan(ch[now][0]);
printf("%d[%c] ",val[now],val[now]+‘a‘);
scan(ch[now][1]);
}
}pp;
char str[MAXN];
int main()
{
freopen("input.txt","r",stdin);
mi[0]=1;
int i;
for (i=1;i<MAXN;i++)
mi[i]=mi[i-1]*29;
scanf("%s",str);
int n=strlen(str);
while (!islower(str[n-1]))
n--;
for (i=0;i<n;i++)
{
pp.insert(i,str[i]-‘a‘);
}
int m;
scanf("%d\n",&m);
char opt;
char ch;
int x,y;
for (i=0;i<m;i++)
{
scanf("%c",&opt);
if (opt==‘Q‘)
{
scanf("%d%d\n",&x,&y);
if (x>y)swap(x,y);
int l=0,r=n-y+2,mid;
while(l+1<r)
{
mid=(l+r)>>1;
if (pp.query(x,x+mid-1)==pp.query(y,y+mid-1))
l=mid;
else
r=mid;
}
printf("%d\n",l);
}else if (opt==‘R‘)
{
scanf("%d %c\n",&x,&ch);
pp.change_val(x,ch-‘a‘);
}else if (opt==‘I‘)
{
scanf("%d %c\n",&x,&ch);
pp.insert(x,ch-‘a‘);
n++;
}
}
}