#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=100010;
int n,m,tot,nr,sum;
struct splay
{
int sx,sl,ch[2],fa,rev;
}s[maxn];
int p[maxn];
char str[10];
bool isr(int x) {return s[s[x].fa].ch[0]!=x&&s[s[x].fa].ch[1]!=x;}
void pushup(int x) {s[x].sl=s[x].sx+s[s[x].ch[0]].sl+s[s[x].ch[1]].sl+1;}
void pushdown(int x)
{
if(s[x].rev)
{
swap(s[x].ch[0],s[x].ch[1]),s[x].rev=0;
if(s[x].ch[0]) s[s[x].ch[0]].rev^=1;
if(s[x].ch[1]) s[s[x].ch[1]].rev^=1;
}
}
void updata(int x)
{
if(!isr(x)) updata(s[x].fa);
pushdown(x);
}
void rotate(int x)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(!isr(y)) s[z].ch[y==s[z].ch[1]]=x;
s[y].fa=x,s[x].fa=z,s[y].ch[d]=s[x].ch[d^1];
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
pushup(y),pushup(x);
}
void splay(int x)
{
updata(x);
while(!isr(x))
{
int y=s[x].fa,z=s[y].fa;
if(!isr(y))
{
if((y==s[z].ch[0])^(x==s[y].ch[0])) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
for(int y=0;x;splay(x),s[x].sx-=s[y].sl-s[s[x].ch[1]].sl,s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa);
}
void maker(int x)
{
access(x),splay(x),s[x].rev^=1;
}
void link(int x,int y)
{
maker(x),access(y),splay(y),s[y].sx+=s[x].sl,s[x].fa=y,pushup(y);
}
int findr(int x)
{
access(x),splay(x),pushdown(x);
while(s[x].ch[0]) x=s[x].ch[0],pushdown(x);
return x;
}
void query(int x,int y)
{
if(!x) return ;
pushdown(x);
query(s[x].ch[0],y);
if(p[0]>=y) return ;
p[++p[0]]=x;
if(p[0]>=y) return ;
query(s[x].ch[1],y);
}
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()
{
//freopen("bz3510.in","r",stdin);
n=rd(),m=rd();
int i,j,a,b,c,d,e,sc,sd;
for(i=1;i<=n;i++) s[i].sl=1,sum^=i;
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]==‘X‘) printf("%d\n",sum);
if(str[0]==‘Q‘) printf("%d\n",findr(rd()));
if(str[0]==‘A‘)
{
a=rd(),b=rd(),c=findr(a),splay(c),d=findr(b),splay(d),sc=s[c].sl,sd=s[d].sl;
if(sc<sd||(sc==sd&&c>d)) swap(c,d),swap(a,b),swap(sc,sd);
link(b,a),access(b),splay(c),p[0]=0,tot=sc+sd,query(c,sd+1),nr=c;
for(j=1;j<=p[0];j++)
{
splay(p[j]);
e=s[p[j]].sx+1+(s[p[j]].ch[1]>0?s[s[p[j]].ch[1]].sl:0);
if(tot-e<e||(tot-e==e&&p[j]<=nr)) nr=p[j];
else break;
}
maker(nr),sum^=nr,sum^=c,sum^=d;
}
}
return 0;
}