//{{{ 
// BEGIN CUT HERE

// ed CUT HERE
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;

#define PB push_back
#define MP make_pair

#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define FORD(i,h,l) for(int i=(h);i>=(l);--i)
#define SORT(vec) sort(vec.begin(), vec.ed())

typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
//}}}

const int maxn=300010;

int lft[maxn<<2],rht[maxn<<2];
int lz[maxn<<2],val[maxn<<2];

void build(int n, int l, int r)
{
    lft[n]=l;
    rht[n]=r;
    lz[n]=val[n]=0;
    if (l==r)
        return;
    int mid=(l+r)/2;
    build(n<<1, l, mid);
    build(n*2+1, mid+1, r);
}

void push(int n)
{
    if (!lz[n] || lft[n]==rht[n])
        return;
    int l = n*2,r=n*2+1;
    lz[l] = lz[r] = val[l] = val[r] = lz[n];
    lz[n] = 0;
}

void upd(int n, int l, int r, int v)
{
    if (lft[n]==l && rht[n]==r)
    {
        lz[n] = val[n] = v;
        return;
    }
    push(n);
    int mid=(lft[n]+rht[n])/2;
    if (r<=mid)
        upd(n*2, l, r, v);
    else if (l>mid)
        upd(n*2+1, l, r, v);
    else
    {
        upd(n*2, l, mid, v);
        upd(n*2+1, mid+1, r, v);
    }
}

int get(int n, int pos)
{
    if (lft[n]==rht[n])
        return val[n];
    push(n);
    if (pos <= (lft[n]+rht[n])/2)
        return get(n<<1, pos);
    else
        return get(n*2+1, pos);
}

int beg[maxn], ed[maxn], idx;

vector<int> ch1[maxn], ch2[maxn];
int fa1[maxn], fa2[maxn];
void dfs1(int n)
{
    beg[n] = ++idx;
    for (int v : ch2[n])
        dfs1(v);
    ed[n] = idx;
}

int ans,cur,tmp;
int bak[maxn];

void dfs2(int n)
{
    tmp = get(1, beg[n]);
    if (tmp>0)
    {
        bak[n] = tmp;
        upd(1, beg[tmp], ed[tmp], -1);
        upd(1, beg[n], ed[n], n);
    }
    else
    {
        bak[n] = 0;
        cur++;
        upd(1, beg[n], ed[n], n);
    }
    ans = max(ans, cur);
    for (int v : ch1[n])
        dfs2(v);
    if (bak[n])
    {
        tmp = bak[n];
        upd(1, beg[n], ed[n], -1);
        upd(1, beg[tmp], ed[tmp], tmp);
    }
    else
    {
        cur--;
        upd(1, beg[n], ed[n], -1);
    }
}

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        for (int i=0;i<=n;i++)
        {
            ch1[i].clear();
            ch2[i].clear();
        }
        idx = ans = cur = tmp = 0;

        for (int i=2;i<=n;i++)
        {
            scanf("%d", &tmp);
            ch1[tmp].push_back(i);
        }
        for (int i=2;i<=n;i++)
        {
            scanf("%d", &tmp);
            ch2[tmp].push_back(i);
        }

        build(1, 1, n);
        dfs1(1);
        dfs2(1);
        printf("%d\n", ans);
    }
}

