#pragma GCC optimization "O2"
#pragma GCC optimization "unroll-loop"
#pragma GCC target ("avx2")

#include <bits/stdc++.h>
#define ll int
#define ld long double
#define fs first
#define sc second
using namespace std;
const ll N = 3e5 + 9;
const ll base = 11;
const ll inf = 1e9 + 7;
typedef pair<ll,ll> LL;
vector<ll> So[N],Ke[N];
ll T,n,x,in[N],out[N],ans,a[N],b[N];
set<LL> s;
LL elim[N];
ll nTime = 1;
void DFS_ke(ll u){
    in[u] = out[u] = nTime; nTime++;
    for (auto i : Ke[u]) DFS_ke(i),out[u] = max(out[u],out[i]);
}

void Repack(){
    s.clear(); nTime = 1; ans = 1;
    for (ll i = 1;i <= n;i++) So[i].clear(),Ke[i].clear(),elim[i] = {0,0};
}

void output(){
    for (auto i : s) cout<<i.fs<<" "<<i.sc<<"x\n";
    exit(0);
}

void oper(ll u){
    LL now = {in[u],out[u]};
    auto q = s.upper_bound(now),p = s.upper_bound(now);
    LL P = {0,0},Q = {inf,inf};
    if (p != s.begin()) p = prev(p);
    if (s.upper_bound(now) != s.begin()) P = *p;
    if (q != s.end()) Q = *q;
    if (P.sc < now.fs && Q.fs > now.sc) s.insert(now);
    else if (P.sc >= now.fs && P != now){
        elim[u] = P;
        s.insert(now),s.erase(p);
    }
    ans = max(ans,(ll)s.size());
}

void DFS_So(ll u){
    LL now = {in[u],out[u]};
    oper(u);
    //if (u == 2) output();
    for (auto i : So[u]){

        DFS_So(i);
        oper(u);
        //if (u == 3) output();
    }
    s.erase(now);
    if(elim[u].fs) s.insert(elim[u]);
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    #define task "test"
    if (fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    cin>>T;
    while(T--){
        cin>>n; Repack();
        for (ll i = 2;i <= n;i++) cin>>x,So[x].push_back(i),a[i] = x;
        for (ll i = 2;i <= n;i++) cin>>x,Ke[x].push_back(i),b[i] = x; //return 0;
        DFS_ke(1); //cout<<in[6]<<" "<<out[6]; return 0;
        DFS_So(1);
        cout<<ans<<"\n";
    }
}
