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

#define INF 1234567890
#define ll long long

#define DATA int
#define IDENTITY INF
DATA init[1010101], seg[2100000], lazy[2100000];
DATA Merge(DATA l, DATA r)
{
	return min(l, r);
}
DATA Init(int n, int l, int r)
{
	lazy[n] = 0;
	if (l == r) return seg[n] = IDENTITY;
	int mid = l+r>>1;
	return seg[n] = Merge(Init(n<<1, l, mid), Init(n<<1|1, mid+1, r));
}
void Propagate(int n, int l, int r)
{
	if (lazy[n])
	{
		if (l != r)
		{
			lazy[n<<1] = lazy[n];
			lazy[n<<1|1] = lazy[n];
		}
		seg[n] = lazy[n];
		lazy[n] = 0;
	}
}
DATA Update(int L, int R, DATA val, int n, int l, int r)
{
	Propagate(n, l, r);
	if (r < L || R < l) return seg[n];
	if (L <= l && r <= R)
	{
		lazy[n] = val;
		Propagate(n, l, r);
		return seg[n];
	}
	int mid = l+r>>1;
	return seg[n] = Merge(Update(L, R, val, n<<1, l, mid), Update(L, R, val, n<<1|1, mid+1, r));
}
DATA Query(int L, int R, int n, int l, int r)
{
	Propagate(n, l, r);
	if (r < L || R < l) return IDENTITY;
	if (L <= l && r <= R) return seg[n];
	int mid = l+r>>1;
	return Merge(Query(L, R, n<<1, l, mid), Query(L, R, n<<1|1, mid+1, r));
}

int res, P, CNT;
int T;
int N;
vector<int> g[300301], h[300301];
int st[300301], en[300301]; // h ver, en : st ver

void DFSH(int n, int prev)
{
	st[n] = ++P;
	for(int next : h[n])
	{
		if (next == prev) continue;
		DFSH(next, n);
	}
	en[st[n]] = P;
}

void DFSG(int n, int prev)
{
	int val = Query(st[n], en[st[n]], 1, 1, N), chk = 0;
	if (val == INF)
	{
		// 구간이 비어 있는 경우에는 그냥 삽입하면 된다.
		Update(st[n], en[st[n]], st[n], 1, 1, N);
		CNT++;
		chk = 1;
	}
	else if (val < st[n])
	{
		// 구간이 조상 하나의 색으로만 칠해져 있으면, 조상을 끌어내리기
		Update(val, en[val], INF, 1, 1, N);
		Update(st[n], en[st[n]], st[n], 1, 1, N);
		chk = 2;
	}

	res = max(res, CNT);

	for(int next : g[n])
	{
		if (next == prev) continue;
		DFSG(next, n);
	}

	// roll-back
	if (chk == 1)
	{
		CNT--;
		Update(st[n], en[st[n]], INF, 1, 1, N);
	}
	else if (chk == 2)
	{
		Update(val, en[val], val, 1, 1, N);
	}
}

int main()
{
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d", &N);
		// clear
		res = 0; P = 0; CNT = 0;
		for(int i=1; i<=N; i++)
		{
			g[i].clear();
			h[i].clear();
		}

		for(int i=2; i<=N; i++)
		{
			int x;
			scanf("%d", &x);
			g[x].push_back(i);
		}
		for(int i=2; i<=N; i++)
		{
			int x;
			scanf("%d", &x);
			h[x].push_back(i);
		}
		DFSH(1, 0); // 이제 h의 정점들은 구간으로 변환되었다.
		Init(1, 1, N);
		DFSG(1, 0); // 리프에서부터 올라오기

		printf("%d\n", res);
	}
	return 0;
}