#include<bits/stdc++.h>usingnamespacestd;longlonginf=1e15;classTree{public:intn;vector<vector<int>>adj;vector<longlong>a;vector<longlong>smin;// smin[src] is the minimum value when the entire subtree at src is
// converted into a mega node.
// Our goal is to keep the mega node as big as possible, so that future
// operations are not hindered.
public:Tree(intn){this->n=n;adj.resize(n);a.resize(n);smin.resize(n,inf);}voiddfs(intsrc,intpar){longlongmin_child=inf;for(autochild:adj[src]){if(child==par){continue;}dfs(child,src);min_child=min(min_child,smin[child]);}if(min_child==inf){smin[src]=a[src];}elseif(a[src]>min_child){smin[src]=min_child;}else{smin[src]=(a[src]+min_child)/2;}}voidprint_answer(){longlongmn=inf;for(autochild:adj[0]){mn=min(mn,smin[child]);}cout<<mn+a[0]<<"\n";}};voidsolve(){intn;cin>>n;Treet(n);for(inti=0;i<n;i++){cin>>t.a[i];}for(inti=1;i<n;i++){intj;cin>>j;j--;t.adj[i].push_back(j);t.adj[j].push_back(i);}t.dfs(0,-1);t.print_answer();}intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);intt;cin>>t;for(intzz=0;zz<t;zz++){solve();}}