#include<cstdio>
#include<cctype>
#include<queue>
#include<ctime>
#include<cstring>
#include<algorithm>
#define mid l+r>>1
#define rep(s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
return x*f;
}
const int maxn=500010;
typedef long long ll;
int n,m,len,type,lastans;
int ch[maxn][2],h[maxn],c[maxn],cnt,rt;
ll rk[maxn];
void rebuild(int& o,ll l,ll r) {
if(!o) return;rk[o]=l+r;
rebuild(ch[o][0],l,mid);rebuild(ch[o][1],mid,r);
}
void rotate(int& o,int d,ll l,ll r) {
int k=ch[o][d^1];ch[o][d^1]=ch[k][d];ch[k][d]=o;
o=k;rebuild(o,l,r);
}
int cmp(int x,int y) {return c[x]<c[y]||(c[x]==c[y]&&rk[x-1]<rk[y-1]);}
void insert(int& o,ll l,ll r) {
if(!o) {o=cnt;rk[o]=l+r;return;}
if(cmp(cnt,o)) {insert(ch[o][0],l,mid);if(h[ch[o][0]]>h[o]) rotate(o,1,l,r);}
else {insert(ch[o][1],mid,r);if(h[ch[o][1]]>h[o]) rotate(o,0,l,r);}
}
void insert(int v) {
c[++cnt]=v;h[cnt]=rand()*rand();
insert(rt,1,1ll<<61);
}
int minv[maxn*3],p[maxn];
void build(int o,int l,int r) {
if(l==r) p[l]=read(),minv[o]=l;
else {
int M=l+r>>1,lc=o<<1,rc=lc|1;
build(lc,l,M);build(rc,M+1,r);
minv[o]=rk[p[minv[lc]]]<=rk[p[minv[rc]]]?minv[lc]:minv[rc];
}
}
void update(int o,int l,int r,int pos) {
if(l==r) return;
int M=l+r>>1,lc=o<<1,rc=lc|1;
if(pos<=M) update(lc,l,M,pos);
else update(rc,M+1,r,pos);
minv[o]=rk[p[minv[lc]]]<=rk[p[minv[rc]]]?minv[lc]:minv[rc];
}
int query(int o,int l,int r,int ql,int qr) {
if(ql<=l&&r<=qr) return minv[o];
int M=l+r>>1,lc=o<<1,rc=lc|1;
if(qr<=M) return query(lc,l,M,ql,qr);
if(ql>M) return query(rc,M+1,r,ql,qr);
int v1=query(lc,l,M,ql,qr),v2=query(rc,M+1,r,ql,qr);
return rk[p[v1]]<=rk[p[v2]]?v1:v2;
}
char s[maxn],cmd[5];
int main() {
n=read();m=read();len=read();type=read();
scanf("%s",s);
rep(1,len) insert(s[len-i]-‘a‘);
build(1,1,n);
while(m--) {
scanf("%s",cmd);
if(!type) lastans=0;
if(cmd[0]==‘I‘) insert(read()^lastans),len++;
else if(cmd[0]==‘C‘) {
int x=read();p[x]=read();
update(1,1,n,x);
}
else {
int x=read(),y=read();
printf("%d\n",lastans=query(1,1,n,x,y));
}
}
return 0;
}