#pragma GCC optimize ("Ofast,unroll-loops")
#pragma GCC optimize("no-stack-protector,fast-math")

#include <bits/stdc++.h>

using namespace std;

#define fastio ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))

signed main() {
    fastio
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> f1(n, -1), f2(n, -1);
        vector<vector<int>> ch1(n), ch2(n);
        for (int i = 1; i < n; i++) cin >> f1[i], f1[i]--, ch1[f1[i]].emplace_back(i);
        for (int i = 1; i < n; i++) cin >> f2[i], f2[i]--, ch2[f2[i]].emplace_back(i);
        vector<int> l(n, -1), r(n, -1);
        int tot = -1;
        function<void(int)> dfs = [&](int u) {
            l[u] = ++tot;
            for (int v: ch2[u]) dfs(v);
            r[u] = tot;
        };
        dfs(0);
        set<pii> ls;
        vector<pii> st;
        // inserted?, erased?
        auto add = [&](int u) -> pair<bool, bool> {
            auto iter = ls.lower_bound({l[u], 0});
            if (iter != ls.end() and iter->fi == l[u] and iter->se > iter->fi) {
                st.emplace_back(iter->fi, iter->se);
                ls.erase(iter);
                ls.emplace(l[u], r[u]);
                return {true, true};
            }
            if (iter != ls.end() and iter->fi >= l[u] and iter->se <= r[u]) {
                return {false, false};
            }
            if (iter != ls.begin()) {
                iter--;
                if (iter->se >= r[u]) {
                    st.emplace_back(iter->fi, iter->se);
                    ls.erase(iter);
                    ls.emplace(l[u], r[u]);
                    return {true, true};
                }
            }
            ls.emplace(l[u], r[u]);
            return {true, false};
        };
        int ans = 0;
        function<void(int)> dfs2 = [&](int u) {
            auto [inserted, erased] = add(u);
            //cout << "add " << u << " " << l[u] << " " << r[u] << ":" << inserted << " " << erased << endl;
            //if (erased) cout << "erase " << st.back().first << " " << st.back().second << endl;
            ans = max(ans, SZ(ls));
            for (int v: ch1[u]) dfs2(v);
            if (inserted) ls.erase({l[u], r[u]});
            if (erased) ls.emplace(st.back()), st.pop_back();
        };
        dfs2(0);
        cout << ans << "\n";
    }
    return 0;
}