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

#define int long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define foru(i, l, r) for(int i = l; i <= r; i++)
#define ford(i, r, l) for(int i = r; i >= l; i--)

typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<ii, ii> iiii;

const int N = 3e5 + 5;

const int oo = 1e18 + 7, mod = 1e9 + 7;

int n, ans;
vector<int> Adj1[N], Adj2[N];
set<ii> segments;

int l[N], r[N], cnt;

void dfs1(int u, int p){
	cnt++;
	l[u] = cnt;
	for(auto v : Adj2[u]){
		if(v == p) continue;
		dfs1(v, u);
	}
	r[u] = cnt;
}

void dfs2(int u, int p){
	ans = max(ans, (int)segments.size());
	for(auto v : Adj1[u]){
		if(v == p) continue;
		ii have_erased = {-1, -1};
		bool in = 0;
		set<ii>::iterator it = segments.upper_bound({r[v], oo});
		if(it == segments.begin()){
			in = 1;
			segments.insert({l[v], r[v]});
			dfs2(v, u);
		}
		else{
			it--;
			if((*it).se < l[v]){
				in = 1;
				segments.insert({l[v], r[v]});
				dfs2(v, u);
			}
			else{
				if(l[v] >= (*it).fi && r[v] <= (*it).se){
					have_erased = (*it);
					segments.erase({(*it)});
					segments.insert({l[v], r[v]});
					in = 1;
					dfs2(v, u);
				}
				else{
					dfs2(v, u);
				}
			}
		}
		if(in) segments.erase({l[v], r[v]});
		if(have_erased.fi != -1) segments.insert(have_erased);
	}
}

void process(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		Adj1[i].clear();
		Adj2[i].clear();
	}
	for(int i = 2; i <= n; i++){
		int x;
		cin >> x;
		Adj1[x].pb(i);
		Adj1[i].pb(x);
	}
	for(int i = 2; i <= n; i++){
		int x;
		cin >> x;
		Adj2[x].pb(i);
		Adj2[i].pb(x);
	}
	segments.clear();
	ans = 0;
	dfs1(1, 1);
	dfs2(1, 1);
	cout << ans << "\n";
}

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t--) process();
}