#include<bits/stdc++.h>
#define ls (o<<1)
#define rs (o<<1|1)
#define mid (pl+pr>>1)
using namespace std;
typedef long long ll;
const int N=3e5+5;
//int sg[N<<2|1],ad[N<<2|1];
int dfn[N],fan[N],siz[N],cl;
vector<int> e1[N],e2[N];
int ans,n;
set<int> st;
int read()
{
	int res=0,fl=0; char a=getchar();
	while(a<'0'||a>'9') fl|=a=='-',a=getchar();
	while(a>='0'&&a<='9') res=res*10+a-'0',a=getchar();
	return fl? -res:res;
}
//void pushr(int o,int pl,int pr,int k) {sg[o]+=k*(pr-pl+1),ad[o]+=k;}
//void push_down(int o,int pl,int pr) {if(ad[o]) pushr(ls,pl,mid,ad[o]),pushr(rs,mid+1,pr,ad[o]),ad[o]=0;}
//void update(int l,int r,int k,int o=1,int pl=1,int pr=n)
//{
//	if(l<=pl&&pr<=r) return pushr(o,pl,pr,k);
//	push_down(o,pl,pr);
//	if(l<=mid) update(l,r,k,ls,pl,mid);
//	if(r>mid) update(l,r,k,rs,mid+1,pr);
//	sg[o]=sg[ls]+sg[rs];
//}
//int query(int l,int r,int o=1,int pl=1,int pr=n)
//{
//	if(l<=pl&&pr<=r) return sg[o];
//	push_down(o,pl,pr);
//	int res=0;
//	if(l<=mid) res+=query(l,r,ls,pl,mid);
//	if(r>mid) res+=query(l,r,rs,mid+1,pr);
//	return res;
//}
void dfs(int x)
{
	dfn[x]=++cl,fan[cl]=x,siz[x]=1;
	for(int i=e2[x].size()-1;~i;i--)
		dfs(e2[x][i]),siz[x]+=siz[e2[x][i]];
}
void dfs2(int x)
{
	int er=-1,is=-1;
	if(st.empty()) is=x,st.insert(x);
	else
	{
		set<int>::iterator it=st.lower_bound(dfn[x]),it2;
		if(it!=st.begin()&&(it2=it,it2--,*it2+siz[fan[*it2]]>dfn[x])) er=*it2;
		if(it==st.end()||dfn[x]+siz[x]<=*it) is=dfn[x],st.insert(dfn[x]);
		if(er!=-1) st.erase(er);
	}
	ans=max(ans,(int)st.size());
	for(int i=e1[x].size()-1;~i;i--) dfs2(e1[x][i]);
	if(is>=0) st.erase(is);
	if(er>=0) st.insert(er);
}
int main()
{
	int i,j,li,t;
	for(t=read();t;t--)
	{
		n=read(),st.clear(),cl=0;
		for(i=1;i<=n;i++) e1[i].clear(),e2[i].clear();
		for(i=2;i<=n;i++) e1[read()].push_back(i);
		for(i=2;i<=n;i++) e2[read()].push_back(i);
		ans=0,dfs(1),dfs2(1),cout<<ans<<'\n';
	}
	return 0;
 } 