#include<bits/stdc++.h>
using namespace std;

#define imax(a,b) (((a)>(b))?(a):(b))
#define imin(a,b) (((a)<(b))?(a):(b))
#define mp make_pair

typedef long long ll;

const int N = 3e5 + 10;

typedef pair<int, int> intp;
int T, n, dfstime, L[N], R[N], ans, num;
vector<int> sd[2][N];
set<intp> np;

void read(int& x)
{
	x = 0; char ch = getchar(); bool f = 0;
	while (!(ch >= '0' && ch <= '9')) f |= (ch == '-'), ch = getchar();
	while ((ch >= '0' && ch <= '9')) x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
	if (f) x = -x;
}

void kdfs(int x)
{
	L[x] = ++dfstime;
	for (vector<int>::iterator iter = sd[1][x].begin();iter != sd[1][x].end();++iter)
		kdfs(*iter);
	R[x] = dfstime;
}

int nofa(int fa, int son){return (L[fa] <= L[son] && R[son] <= R[fa]) ? 0 : 1;}

void sdfs(int x)
{
	int mark = num;
	set<intp>::iterator now = np.lower_bound({ L[x],0 });
	if (now != np.end()) num += nofa(x, now->second);
	if (now != np.begin())
	{
		set<intp>::iterator fnow = now--;
		num += nofa(now->second, x);
		if (fnow != np.end()) num -= nofa(now->second, fnow->second);
	}
	np.insert({ L[x],x });
	ans = imax(ans, num);
	for (vector<int>::iterator iter = sd[0][x].begin();iter != sd[0][x].end();++iter)
		sdfs(*iter);
	np.erase({ L[x],x });
	num = mark;
}

int main()
{
	read(T);
	while (T--)
	{
		read(n);
		for (int h = 0;h < 2;++h)
		for (int i = 2;i <= n;++i)
		{
			int a; read(a);
			sd[h][a].push_back(i);
		}
		dfstime = 0; kdfs(1);
		ans = 1; num = 1; sdfs(1);
		for (int i = 1;i <= n;++i) sd[0][i].clear(), sd[1][i].clear();
		printf("%d\n", ans);
	}
	return 0;
}