#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 80000
#define MAXV 70007
#define MAXT 30000000
#define alpha 0.7
struct sgt_node
{
int lc,rc,tot;
}sgt[MAXT];
int topt=0;
int stack2[MAXT];
void Add_sgt(int &now,int l,int r,int pos,int delta)
{
if (!now)
{
int old=now;
now=stack2[topt--];
if (topt<0)throw 3;
now=stack2[topt+1];
if (sgt[now].lc)stack2[++topt]=sgt[now].lc;
if (sgt[now].rc)stack2[++topt]=sgt[now].rc;
sgt[now]=sgt[old];
}
sgt[now].tot+=delta;
if (l==r)return ;
if (pos<=((l+r)>>1))
Add_sgt(sgt[now].lc,l,((l+r)>>1),pos,delta);
else
Add_sgt(sgt[now].rc,((l+r)>>1)+1,r,pos,delta);
if (sgt[now].tot==0)
{
sgt[now].lc=sgt[now].rc=0;
stack2[++topt]=now;
now=0;
}
}
int Qry_sgt(int &now,int l,int r,int x,int y)
{
if (!now)return 0;
if (l==x && r==y)return sgt[now].tot;
int mid=(l+r)>>1;
if (y<=mid)
return Qry_sgt(sgt[now].lc,l,mid,x,y);
else if (mid<x)
return Qry_sgt(sgt[now].rc,mid+1,r,x,y);
else return Qry_sgt(sgt[now].lc,l,mid,x,mid)+Qry_sgt(sgt[now].rc,mid+1,r,mid+1,y);
}
struct Scap_tree
{
int lc,rc;
int val,root;
int siz;
}scp[MAXN];
int tops=-1,root=0;
int stack[MAXN];
int *Add_scp(int &now,int pos,int v)
{
if (!now)
{
now=stack[tops--];
if (tops<0)throw 2;
scp[now].val=v;
Add_sgt(scp[now].root,0,MAXV,v,1);
scp[now].siz=1;
return NULL;
}
int* ret;
if (pos==scp[scp[now].lc].siz+1)
ret=Add_scp(scp[now].lc,pos,v);
else if (pos<=scp[scp[now].lc].siz)
ret=Add_scp(scp[now].lc,pos,v);
else
ret=Add_scp(scp[now].rc,pos-scp[scp[now].lc].siz-1,v);
Add_sgt(scp[now].root,0,MAXV,v,1);
scp[now].siz++;
if (max(scp[scp[now].lc].siz,scp[scp[now].rc].siz)>scp[now].siz*alpha)
return &now;
return ret;
}
int Modify_scp(int now,int pos,int v)
{
Add_sgt(scp[now].root,0,MAXV,v,1);
int t;
if (scp[scp[now].lc].siz+1==pos)
{
t=scp[now].val;
Add_sgt(scp[now].root,0,MAXV,t,-1);
scp[now].val=v;
return t;
}
if (scp[scp[now].lc].siz>=pos)
t=Modify_scp(scp[now].lc,pos,v);
else
t=Modify_scp(scp[now].rc,pos-scp[scp[now].lc].siz-1,v);
Add_sgt(scp[now].root,0,MAXV,t,-1);
return t;
}
int vec[MAXN],topv=-1;
void Scan(int now)
{
if (!now)return ;
Scan(scp[now].lc);
vec[++topv]=scp[now].val;
Scan(scp[now].rc);
stack[++tops]=now;
stack2[++topt]=scp[now].root;
scp[now].siz=scp[now].lc=scp[now].rc=scp[now].val=scp[now].root=0;
}
void Scan2(int now)
{
if (!now)return ;
Scan2(scp[now].lc);
printf("%d ",scp[now].val);
Scan2(scp[now].rc);
}
void Build_scp(int &now,int l,int r)
{
if (l>r)return;
now=stack[tops--];
if (tops<0)throw 2;
if (now>=MAXN)throw 1;
scp[now].val=vec[(l+r)>>1];
scp[now].root=0;
scp[now].siz=r-l+1;
for (int i=l;i<=r;i++)
Add_sgt(scp[now].root,0,MAXV,vec[i],1);
Build_scp(scp[now].lc,l,((l+r)>>1)-1);
Build_scp(scp[now].rc,((l+r)>>1)+1,r);
}
void Rebuild(int &now)
{
if (&now==NULL)return ;
topv=-1;
Scan(now);
//for (int i=0;i<vec.size();i++)printf("%d ",vec[i]);printf("\n");
Build_scp(now,0,topv);
}
pair<int,int> lst[MAXN];
int topl=-1;
void Search_scp(int now,int l,int d,bool f)
{
if (!l)return ;
if (l==scp[now].siz)
{
lst[++topl]=make_pair(scp[now].root,d);
return ;
}
if (f==0)
{
if (scp[scp[now].lc].siz>=l)
{
Search_scp(scp[now].lc,l,d,false);
}else
{
lst[++topl]=make_pair(scp[now].root,d);
Search_scp(scp[now].rc,scp[now].siz-l,-d,true);
}
}else
{
if (scp[scp[now].rc].siz>=l)
{
Search_scp(scp[now].rc,l,d,true);
}else
{
lst[++topl]=make_pair(scp[now].root,d);
Search_scp(scp[now].lc,scp[now].siz-l,-d,false);
}
}
}
int Query_kth(int ll,int rr,int rank)
{
topl=-1;
Search_scp(root,ll-1,-1,false);
Search_scp(root,rr,1,false);
int l=0,r=MAXV;
int mid;
int sum;
int i;
while (l!=r)
{
mid=(l+r)>>1;
sum=0;
for (i=0;i<=topl;i++)
sum+=sgt[sgt[lst[i].first].lc].tot*lst[i].second;
if (rank<=sum)
{
r=mid;
for (i=0;i<=topl;i++)
lst[i].first=sgt[lst[i].first].lc;
}else
{
rank-=sum;
l=mid+1;
for (i=0;i<=topl;i++)
lst[i].first=sgt[lst[i].first].rc;
}
}
return l;
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int i,j,k,x,y,z,n,m;
for (i=1;i<MAXN;i++)stack[++tops]=i;
for (i=1;i<MAXT;i++)stack2[++topt]=i;
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%d",&x);
vec[++topv]=x;
}
Build_scp(root,0,topv);
scanf("%d\n",&m);
//Scan2(root);printf("\n");
char opt;
int lastans=0;
for (i=0;i<m;i++)
{
scanf("%c",&opt);
if (i==38487)
--++i;
if (opt==‘I‘)
{
scanf("%d %d\n",&x,&y);
x^=lastans;y^=lastans;
Rebuild(*Add_scp(root,x,y));
}else if (opt==‘M‘)
{
scanf("%d %d\n",&x,&y);
x^=lastans;y^=lastans;
Modify_scp(root,x,y);
}else if (opt==‘Q‘)
{
scanf("%d %d %d\n",&x,&y,&z);
x^=lastans;y^=lastans;z^=lastans;
printf("%d\n",lastans=Query_kth(x,y,z));
}
//printf("%d %d %d\n",i,tops,topt);
}
}