#include <cstdio>
#include <algorithm>
#define N 100008
#define ls s[x].ch[0]
#define rs s[x].ch[1]
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
struct data {
int rev,f,ch[2],si;
}s[N];
int p[N],ax[N],bx[N],w[N],sta[N];
int get(int x) { return s[s[x].f].ch[1]==x; }
int isr(int x) { return s[s[x].f].ch[0]!=x&&s[s[x].f].ch[1]!=x; }
void pushup(int x) { s[x].si=s[ls].si+s[rs].si+1; }
void rotate(int x)
void mark(int x) {
swap(ls,rs),s[x].rev^=1;
}
void pushdown(int x)
}
void splay(int x)
void access(int x) {
for(int y=0;x;y=x,x=s[x].f)
splay(x),rs=y,pushup(x);
}
void makert(int x) {
access(x),splay(x),mark(x);
}
void link(int x,int y) {
makert(x),s[x].f=y;
}
void init() {
for(int i=0;i<N;++i) {
p[i]=i;
w[i]=0,ax[i]=bx[i]=i;
}
}
int find(int x) {
return p[x]==x?x:p[x]=find(p[x]);
}
int Dis(int x,int y) {
makert(x),access(y),splay(y);
return s[y].si-1;
}
struct node {
int x,y;
node(int x=0,int y=0):x(x),y(y){}
}ma[10];
void merge(int x,int y)
else {
p[oa]=ob;
w[ob]=c;
ax[ob]=ma[a].x;
bx[ob]=ma[b].x;
}
link(x,y);
}
int main()
if(op[0]=='Q') {
scanf("%d",&x),y=find(x);
int a=ax[y],b=bx[y];
printf("%d
",max(Dis(x,a),Dis(x,b)));
}
}
return 0;
}