#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=200010;
const int mod=1048576;
int n0,n,m,ans,tot,root,last,flast;
struct trie
{
int ch[2],siz;
}s[30000010];
struct node
{
int s1,s2;
node(){}
node(int a,int b){s1=a,s2=b;}
}sec;
struct tzy
{
int ls,rs,siz,msiz,rt,val,fa;
node sm;
}t[maxn];
int p[maxn],pp[maxn];
char str[5];
queue<int> q;
void pushup(node &x,node y)
{
if(y.s1>x.s1) x.s2=max(x.s1,y.s2),x.s1=y.s1;
else x.s2=max(x.s2,y.s1);
}
void insert(int &x,int y,int val)
{
if(!x) x=q.front(),q.pop();
int u=x,i,d;
for(i=1<<20;i;i>>=1)
{
d=((y&i)>0);
if(!s[u].ch[d]) s[u].ch[d]=q.front(),q.pop();
u=s[u].ch[d],s[u].siz+=val;
}
}
int query(int val)
{
int i,j,d,ret=0;
for(i=1<<20;i;i>>=1)
{
d=!(val&i);
for(j=1;j<=p[0];j++)
{
if(s[s[p[j]].ch[d]].siz)
{
ret|=i;
break;
}
}
if(j>p[0]) d^=1;
for(j=1;j<=p[0];j++) p[j]=s[p[j]].ch[d];
}
for(i=1;i<=pp[0];i++) ret=max(ret,val^pp[i]);
return ret;
}
int build(int l,int r,int from)
{
if(l>r) return 0;
int mid=(l+r)>>1,x=p[mid],i;
t[x].ls=build(l,mid-1,x),t[x].rs=build(mid+1,r,x),t[x].siz=t[x].msiz=r-l+1,t[x].rt=0,t[x].fa=from;
t[x].sm.s1=t[x].val,t[x].sm.s2=-1;
if(t[x].ls) t[t[x].ls].fa=x,pushup(t[x].sm,t[t[x].ls].sm);
if(t[x].rs) t[t[x].rs].fa=x,pushup(t[x].sm,t[t[x].rs].sm);
for(i=l;i<=r;i++) insert(t[x].rt,t[p[i]].val,1);
return x;
}
void del(int &x)
{
if(!x) return ;
del(s[x].ch[0]),del(s[x].ch[1]),s[x].siz=0,q.push(x),x=0;
}
void dfs(int x)
{
if(!x) return ;
dfs(t[x].ls);
if(t[x].val>=0) p[++p[0]]=x;
dfs(t[x].rs),del(t[x].rt);
}
void add(int &x,int y,int from)
{
if(!x)
{
x=n,t[x].sm.s1=t[x].val,t[x].sm.s2=-1,t[x].ls=t[x].rs=t[x].rt=0,t[x].fa=from,t[x].siz=t[x].msiz=1;
insert(t[x].rt,t[x].val,1);
return ;
}
if(y>=t[t[x].ls].siz+(t[x].val>=0)) add(t[x].rs,y-t[t[x].ls].siz-(t[x].val>=0),x);
else add(t[x].ls,y,x);
insert(t[x].rt,t[n].val,1),t[x].siz++,pushup(t[x].sm,t[n].sm);
t[x].msiz=t[t[x].ls].msiz+t[t[x].rs].msiz+1;
if(t[t[x].ls].msiz>t[x].msiz*0.75||t[t[x].rs].msiz>t[x].msiz*0.75) last=x,flast=from,t[x].msiz=t[x].siz;
}
void find(int x,int a,int b)
{
if(!x||a>b) return ;
if(a==1&&b==t[x].siz)
{
pushup(sec,t[x].sm);
p[++p[0]]=t[x].rt;
return ;
}
if(a>t[t[x].ls].siz+(t[x].val>=0)) find(t[x].rs,a-t[t[x].ls].siz-(t[x].val>=0),b-t[t[x].ls].siz-(t[x].val>=0));
else if(b<=t[t[x].ls].siz) find(t[x].ls,a,b);
else
{
find(t[x].ls,a,t[t[x].ls].siz);
if(t[x].val>=0) pp[++pp[0]]=t[x].val,pushup(sec,node(t[x].val,-1));
find(t[x].rs,1,b-t[t[x].ls].siz-(t[x].val>=0));
}
}
int getval(int x,int y)
{
if(y>t[t[x].ls].siz+(t[x].val>=0)) return getval(t[x].rs,y-t[t[x].ls].siz-(t[x].val>=0));
if(y<=t[t[x].ls].siz) return getval(t[x].ls,y);
return t[x].val;
}
void dec(int x,int y,int z)
{
if(y>t[t[x].ls].siz+(t[x].val>=0)) dec(t[x].rs,y-t[t[x].ls].siz-(t[x].val>=0),z);
else if(y<=t[t[x].ls].siz) dec(t[x].ls,y,z);
else t[x].val=-1;
t[x].sm.s1=t[x].val,t[x].sm.s2=-1,t[x].siz--;
insert(t[x].rt,z,-1);
if(t[x].ls) pushup(t[x].sm,t[t[x].ls].sm);
if(t[x].rs) pushup(t[x].sm,t[t[x].rs].sm);
}
void modify(int x,int y,int a,int b)
{
if(y>t[t[x].ls].siz+(t[x].val>=0)) modify(t[x].rs,y-t[t[x].ls].siz-(t[x].val>=0),a,b);
else if(y<=t[t[x].ls].siz) modify(t[x].ls,y,a,b);
else t[x].val=b;
insert(t[x].rt,a,-1),insert(t[x].rt,b,1);
t[x].sm.s1=t[x].val,t[x].sm.s2=-1;
if(t[x].ls) pushup(t[x].sm,t[t[x].ls].sm);
if(t[x].rs) pushup(t[x].sm,t[t[x].rs].sm);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<‘0‘||gc>‘9‘) {if(gc==‘-‘)f=-f; gc=getchar();}
while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+gc-‘0‘,gc=getchar();
return ret*f;
}
int main()
{
n0=n=rd(),m=rd();
int i,a,b,c,u;
for(i=1;i<=30000000;i++) q.push(i);
for(i=1;i<=n;i++) t[i].val=rd(),p[i]=i;
root=build(1,n,0);
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]==‘I‘)
{
a=(rd()+ans)%n0,b=(rd()+ans)%mod,n0++;
t[++n].val=b,last=0,add(root,a,0);
if(last)
{
p[0]=0,dfs(last);
if(!flast) root=build(1,p[0],0);
else if(last==t[flast].ls) t[flast].ls=build(1,p[0],flast);
else t[flast].rs=build(1,p[0],flast);
for(u=last;u;u=t[u].fa) t[u].msiz=t[t[u].ls].msiz+t[t[u].rs].msiz+1;
}
}
if(str[0]==‘D‘)
{
a=(rd()+ans)%n0+1,b=getval(root,a),n0--;
dec(root,a,b);
}
if(str[0]==‘C‘)
{
a=(rd()+ans)%n0+1,b=(rd()+ans)%mod,c=getval(root,a);
modify(root,a,c,b);
}
if(str[0]==‘F‘)
{
a=(rd()+ans)%n0+1,b=(rd()+ans)%n0+1;
p[0]=pp[0]=0,sec.s1=sec.s2=-1,find(root,a,b);
ans=query(sec.s2);
printf("%d\n",ans);
}
}
return 0;
}//5 10 2 6 3 8 7 F 1 4 I 2 1048565 I 0 1048566 D 3 F 3 0 I 3 1048569 D 5 C 1 1048570 F 1 2 F 2 1