#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
#define int ll

#define pb push_back
#define sz(v) (int((v).size()))
#define all(v) (v).begin(),(v).end()

const int inf=1000000000000000000ll;

const int maxn=200005;
int n,m;
int a[maxn],f[maxn];
vector<int> v[maxn];
vector<int> point[maxn];

void dfs(int pos,int dep) {
	m=max(m,dep);
	point[dep].pb(pos);
	for(int i=0;i<sz(v[pos]);i++)
		dfs(v[pos][i],dep+1);
}

bool cmp(int p1,int p2) {
	return a[p1]<a[p2];
}

void get_dp(int dep) {
	sort(all(point[dep]),cmp);
	int maxa=a[point[dep][sz(point[dep])-1]],mina=a[point[dep][0]];
	vector<int> val;
	for(int i=0;i<sz(point[dep]);i++) {
		int pos=point[dep][i],gt=0;
		for(int j=0;j<sz(v[pos]);j++) {
			int to=v[pos][j];
			gt=max(gt,f[to]);
		}
		val.pb(gt);
		gt+=max(abs(maxa-a[pos]),abs(mina-a[pos]));
		f[pos]=gt;
	}
	multiset<int,greater<int> > less_max,more_max;
	for(int i=0;i<sz(point[dep]);i++) {
		int pos=point[dep][i];
		more_max.insert(val[i]+a[pos]);
	}
	for(int i=0;i<sz(point[dep]);i++) {
		int pos=point[dep][i];
		int gt=max(more_max.empty()?-inf:(*more_max.begin())-a[pos],less_max.empty()?-inf:(*less_max.begin())+a[pos]);
		f[pos]=max(f[pos],gt);
		more_max.erase(val[i]+a[pos]);
		less_max.insert(val[i]-a[pos]);
	}
}

void solve() {
	m=0;
	cin>>n;
	for(int i=2;i<=n;i++) {
		int x;
		cin>>x;
		v[x].pb(i);
	}
	for(int i=2;i<=n;i++)
		cin>>a[i];
	dfs(1,1);
	for(int i=m;i>=1;i--)
		get_dp(i);
	cout<<f[1]<<endl;
	for(int i=1;i<=n;i++) {
		v[i].clear();
		point[i].clear();
		f[i]=0;
	}
}

signed main() {
	int T;
	cin>>T;
	while(T--) solve();
	return 0;
}
