#include<bits/stdc++.h>
#define FASTIO() cin.sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)
#define D(x) #x,x
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pll pair<ll,ll>
#define MP make_pair
#define pb push_back
using namespace std;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(ll &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf("%c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const ll &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.fi); putchar(' '); _W(x.se);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
const int inf = 0x3f3f3f3f;
int T,n;
vector<int> g[200005];
int a[200005];
int fa[200005],dep[200005];
int cmx[200005],cmn[200005];
ll pmx[200005],nmx[200005];
ll dp[200005];
void getd(int u, int p)
{
    fa[u] = p;
    dep[u] = dep[p]+1;
    cmx[dep[u]] = max(cmx[dep[u]],a[u]);
    cmn[dep[u]] = min(cmn[dep[u]],a[u]);
    for(int v:g[u])
    {
        if(v==p) continue;
        getd(v,u);
    }
}
void solve()
{
    queue<int> q;
    q.push(1);
    while(!q.empty())
    {
        int now = q.front(); q.pop();
        dp[now] = dp[fa[now]]+max(abs(a[now]-cmx[dep[now]]),abs(a[now]-cmn[dep[now]]));
        dp[now] = max({dp[now],pmx[dep[now]-1]-a[now],nmx[dep[now]-1]+a[now]});
        for(int v:g[now])
        {
            if(v==fa[now]) continue;
            q.push(v);
            pmx[dep[now]] = max(pmx[dep[now]],dp[now]+a[v]);
            nmx[dep[now]] = max(nmx[dep[now]],dp[now]-a[v]);
        }

    }
}
int main()
{
    R(T);
    while(T--)
    {
        R(n);
        for(int i = 1; i <= n; ++i)
            g[i].clear(),cmx[i] = pmx[i] = nmx[i] = -inf,cmn[i] = inf;
        for(int i = 2,x; i <= n; ++i)
        {
            R(x);
            g[i].pb(x);
            g[x].pb(i);
        }
        for(int i = 2; i <= n; ++i)
            R(a[i]);
        getd(1,0);
        solve();
        ll ans = 0;
        for(int i = 1; i <= n; ++i)
            ans = max(ans,dp[i]);
        W(ans);
    }
    return 0;
}







