#include<bits/stdc++.h>
#define mz 1000000007

using namespace std;

int a[200005],f[200005],d[200005];
int minson[200005],maxson[200005],mind[200005],maxd[200005];
long long dp[200005],mdis1[200005],mdis2[200005];
vector <int> vec[200005];
queue <int> q;

void dfs(int x,int y,int fa)
{
    f[x]=fa;
    d[x]=y;
    maxson[fa]=max(maxson[fa],a[x]);
    minson[fa]=min(minson[fa],a[x]);
    maxd[y]=max(maxd[y],a[x]);
    mind[y]=min(mind[y],a[+x]);
    for(int i=0;i<vec[x].size();i++)
    {
        if(vec[x][i]!=fa)
            dfs(vec[x][i],y+1,x);
    }
    if(maxson[x]==0)
        q.push(x);
}

int main()
{
    int t,n,u;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            vec[i].clear();
            dp[i]=0;
            mdis1[i]=mdis2[i]=-mz;
            minson[i]=mind[i]=mz;
            maxson[i]=maxd[i]=0;
        }
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&u);
            vec[u].push_back(i);
            vec[i].push_back(u);
        }
        for(int i=2;i<=n;i++)
            scanf("%d",&a[i]);
        dfs(1,1,0);
        while(!q.empty())
        {
            u=q.front();
            q.pop();
            if(f[u]!=1 && dp[f[u]]==0)
                q.push(f[u]);
            dp[u]=max(dp[u],mdis1[d[u]]-minson[u]);
            dp[u]=max(dp[u],mdis2[d[u]]+maxson[u]);
            dp[f[u]]=max(dp[f[u]],dp[u]+max(abs(a[u]-mind[d[u]]),abs(a[u]-maxd[d[u]])));
            mdis1[d[u]-1]=max(mdis1[d[u]-1],dp[u]+a[u]);
            mdis2[d[u]-1]=max(mdis2[d[u]-1],dp[u]-a[u]);
        }
        printf("%lld\n",dp[1]);
    }
    return 0;
}
