func_code_string: #include<bits/stdc++.h>   using namespace std;      #define imax(a,b) (((a)>(b))?(a):(b))   #define imin(a,b) (((a)<(b))?(a):(b))   #define mp make_pair      typedef long long ll;      const int N = 3e5 + 10;      typedef pair<int, int> intp;   int T, n, dfstime, L[N], R[N], ans, num;   vector<int> sd[2][N];   set<intp> np;      void read(int& x)   {    x = 0; char ch = getchar(); bool f = 0;    while (!(ch >=  0  && ch <=  9 )) f |= (ch ==  - ), ch = getchar();    while ((ch >=  0  && ch <=  9 )) x = (x << 3) + (x << 1) + ch -  0 , ch = getchar();    if (f) x = -x;   }      void kdfs(int x)   {    L[x] = ++dfstime;    for (vector<int>::iterator iter = sd[1][x].begin();iter != sd[1][x].end();++iter)     kdfs(*iter);    R[x] = dfstime;   }      int nofa(int fa, int son){return (L[fa] <= L[son] && R[son] <= R[fa]) ? 0 : 1;}      void sdfs(int x)   {    int mark = num;    set<intp>::iterator now = np.lower_bound({ L[x],0 });    if (now != np.end()) num += nofa(x, now->second);    if (now != np.begin())    {     set<intp>::iterator fnow = now--;     num += nofa(now->second, x);     if (fnow != np.end()) num -= nofa(now->second, fnow->second);    }    np.insert({ L[x],x });    ans = imax(ans, num);    for (vector<int>::iterator iter = sd[0][x].begin();iter != sd[0][x].end();++iter)     sdfs(*iter);    np.erase({ L[x],x });    num = mark;   }      int main()   {    read(T);    while (T--)    {     read(n);     for (int h = 0;h < 2;++h)     for (int i = 2;i <= n;++i)     {      int a; read(a);      sd[h][a].push_back(i);     }     dfstime = 0; kdfs(1);     ans = 1; num = 1; sdfs(1);     for (int i = 1;i <= n;++i) sd[0][i].clear(), sd[1][i].clear();     printf( %d n , ans);    }    return 0;   }