#include #include #include #include #include #include using namespace std; typedef long long ll; typedef long double ld; typedef pair pr; const double pi=acos(-1); #define rep(i,a,n) for(int i=a;i<=n;i++) #define per(i,n,a) for(int i=n;i>=a;i--) #define Rep(i,u) for(int i=head[u];i;i=Next[i]) #define clr(a) memset(a,0,sizeof a) #define pb push_back #define mp make_pair #define fi first #define sc second ld eps=1e-9; ll pp=1000000007; ll mo(ll a,ll pp){if(a>=0 && a>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;} ll read(){ ll ans=0; char last=' ',ch=getchar(); while(ch<'0' || ch>'9')last=ch,ch=getchar(); while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar(); if(last=='-')ans=-ans; return ans; } //head #define N 60001 int Min[N],dep[N],fa[N][20],v[N],Next[N],head[N],sum[N],num=0,cost[N],n; int pre[N][20],Max[N]; void add(int x,int y){ v[++num]=y;Next[num]=head[x];head[x]=num; } void dfs1(int u){ pre[u][0]=cost[u]; for(int i=1;(1<Max[u]){ Min[u]=Min[v[i]]+cost[u]; Max[u]=max(Max[v[i]],cost[u]); } } } void dfs2(int u){ for(int i=head[u];i;i=Next[i]){ if(Min[u]+cost[v[i]]Max[v[i]]){ Min[v[i]]=Min[u]+cost[v[i]]; Max[v[i]]=max(Max[u],cost[v[i]]); } dfs2(v[i]); } } int lca(int x,int y){ if(dep[x]=0;i--) if(dep[x]-(1<=dep[y])x=fa[x][i]; if(x==y)return x; for(int i=16;i>=0;i--) if(dep[x]>=(1<=0;i--) if(dep[x]-(1<=dep[y]){ ans=max(ans,pre[x][i]); x=fa[x][i]; } return ans; } int main(){ int T=read(); while(T--){ memset(sum,0,sizeof sum); memset(dep,0,sizeof dep); memset(pre,0,sizeof pre); n=read(); num=0; rep(i,1,n)head[i]=0; int Q=read(); rep(i,2,n){ fa[i][0]=read(); add(fa[i][0],i); } rep(i,1,n)cost[i]=read(); dfs1(1); dfs2(1); rep(i,1,n){ int s1=Min[i]+cost[1],t1=max(Max[i],cost[1]); int s2=sum[i],t2=get(i,1); if(s1t2)Min[i]=s1,Max[i]=t1; else Min[i]=s2,Max[i]=t2; } while(Q--){ int x=read(),y=read(); int z=lca(x,y); int ans1=sum[x]+sum[y]-sum[z]-sum[fa[z][0]],t1=max(get(x,z),get(y,z)); int ans2=Min[x]+Min[y]-cost[1],t2=max(Max[x],Max[y]); if(ans1t2)printf("%d %d\n",ans1,t1); else printf("%d %d\n",ans2,t2); } } return 0; }