rt
#include<bits/stdc++.h>
#define N 50005
#define B 22
using namespace std;
int n;
int a[N];
vector<int> up[N];
vector<int> dn[N];
struct node
{
int from,to,next;
}e[N << 1];
int head[N],cnt;
int b[N],c[N];
int f[N][19],son[N],dep[N],top[N],d[N];
int lo2[N];
int sum[N][B + 5];
void add(int u,int v)
{
e[++cnt].from = u;
e[cnt].to = v;
e[cnt].next= head[u];
head[u] = cnt;
}
void dfs1(int x,int fa)
{
f[x][0] = fa;
dep[x] = d[x] = d[fa] + 1;
for(int j = 1;j <= 18;j++) f[x][j] = f[f[x][j - 1]][j - 1];
for(int i = head[x];i;i = e[i].next)
{
int k = e[i].to;
if(k != fa) dfs1(k,x);
if(dep[k] > dep[x]) dep[x] = dep[k],son[x] = k;
}
}
void dfs2(int x,int fa,int tt)
{
top[x] = tt;
for(int i = 1,p = f[x][0];i <= B;i ++,p = f[p][0]) sum[x][i] = sum[p][i] + a[x];
if(x == tt)
{
for(int i = 0,v = x;i <= dep[x] - d[x];i++)
up[x].push_back(v),v = f[v][0];
for(int i = 0,v = x;i <= dep[x] - d[x];i++)
dn[x].push_back(v),v = son[v];
}
if(son[x]) dfs2(son[x],x,tt);
for(int i = head[x];i;i = e[i].next)
{
int k = e[i].to;
if(k != son[x] && k != fa) dfs2(k,x,k);
}
}
int kth(int x,int ci)
{
if(d[x] <= ci) return 0;
if(!ci) return x;
x = f[x][lo2[ci]];
ci -= (1 << lo2[ci]);
ci -= d[x] - d[top[x]];x = top[x];
return ci >= 0 ? up[x][ci] : dn[x][-ci];
}
int lca(int u,int v)
{
if(d[u] <= d[v]) swap(u,v);
for(int i = 18;i >= 0;i--)
if(d[f[u][i]] >= d[v]) u = f[u][i];
if(u == v) return u;
for(int i = 18;i >= 0;i--)
if(f[u][i] != f[v][i]) u = f[u][i],v = f[v][i];
return f[u][0];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= n - 1;i++)
{
int u,v;
cin >> u >> v;
add(u,v);
add(v,u);
}
for(int i = 1;i <= n;i++) cin >> b[i];
for(int i = 1;i < n;i++) cin >> c[i];
lo2[1] = 0;
for(int i = 2;i <= n;i++) lo2[i] = lo2[i >> 1] + 1;
dfs1(1,0);
dfs2(1,0,1);
for(int i = 1;i < n;i++)
{
int u = b[i],v = b[i + 1];
int k = c[i];
int anc = lca(u,v);
int res = 0;
int dis = d[u] + d[v] - 2 * d[anc];
//cout << u << " " << v << " " << anc << " " << d[u] << " " << d[v] << " " << dis % k << endl;
if(k <= B)
{
int numu = (d[u] - d[anc]) / k + 1;
res += sum[u][k] - sum[kth(u,k * numu)][k];
int numv = (d[v] - d[anc]) / k + 1;
res += sum[v][k] - sum[kth(v,k * numv)][k];
if((d[u] - d[anc]) % k == 0 && (d[v] - d[anc]) % k == 0) res -= a[anc];
cout << res << endl;
}
else
{
for(int j = u;d[j] >= d[anc];j = kth(j,k)) res += a[i];
for(int j = v;d[j] >= d[anc];j = kth(j,k)) res += a[i];
if((d[u] - d[anc]) % k == 0 && (d[v] - d[anc]) % k == 0) res -= a[anc];
cout << res << endl;
}
}
return 0;
}