#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
struct bian
{
long long v,nex;
}s[300000];
struct node
{
long long head,son,fa,top;
long long a,b,dis;
long long siz,dp;
}tre[300000];
struct node1
{
long long id,dui;
long long dp,a,b;
bool could;
}p[300000];
long long n,len=0;
long long q[300000];
inline long long rd()
{
long long s=0,w=1;char x='x';
while(x<'0'||x>'9'){x=getchar();if(x=='-')w=-1;}
while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
return s*w;
}
inline void lian(long long u,long long v)
{
len++;s[len].v=v;s[len].nex=tre[u].head;tre[u].head=len;
len++;s[len].v=u;s[len].nex=tre[v].head;tre[v].head=len;
}
inline void pushback(long long u,bool x){len++;p[len]={len,u,tre[u].dp,tre[u].a,tre[u].b,x};}
inline void readd()
{
n=rd();
for(long long i=1;i<=n;i++)
tre[i].a=rd(),tre[i].dp=inf;
for(long long i=1;i<=n;i++)
tre[i].b=rd();
for(long long i=1,u,v;i<n;i++)
{
u=rd();v=rd();
lian(u,v);
}
}
void build1(long long u)
{
tre[u].siz=1;
for(long long i=tre[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(v!=tre[u].fa)
{
tre[v].fa=u;tre[v].dis=tre[u].dis+1;
build1(v);
tre[u].siz+=tre[v].siz;
if(tre[u].son==0||tre[v].siz>tre[tre[u].son].siz)
tre[u].son=v;
}
}
}
void build2(long long u)
{
if(tre[u].son==0)return;
tre[tre[u].son].top=tre[u].top;
build2(tre[u].son);
for(long long i=tre[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(v!=tre[u].fa&&v!=tre[u].son)
{
tre[v].top=v;
build2(v);
}
}
}
void add(long long u)
{
pushback(u,false);
for(long long i=tre[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(v!=tre[u].fa)
add(v);
}
}
inline bool cmp1(node1 x,node1 y){return x.b!=y.b?x.b<y.b:x.dp<y.dp;}
inline bool cmp2(node1 x,node1 y){return -x.a<-y.a;}
inline bool cmp3(node1 x,node1 y){return x.id<y.id;}
void cdq(long long l,long long r)
{
if(l>=r)
return;
long long mid=(l+r)/2;
cdq(l,mid);
sort(p+l,p+mid+1,cmp1);
sort(p+mid+1,p+r+1,cmp2);
long long head=1,tail=0;
for(long long i=l;i<=mid;i++)
{
if(i!=l&&p[i].b==p[i-1].b)continue;
while(head<tail&&(p[q[tail]].dp-p[q[tail-1]].dp)*(p[i].b-p[q[tail-1]].b)>(p[i].dp-p[q[tail-1]].dp)*(p[q[tail]].b-p[q[tail-1]].b))tail--;
q[++tail]=i;
}
for(long long i=mid+1;i<=r;i++)
{
if(!p[i].could)continue;
while(head<tail&&p[q[head+1]].dp+p[i].a*p[q[head+1]].b<=p[q[head]].dp+p[i].a*p[q[head]].b)head++;
p[i].dp=min(p[i].dp,p[q[head]].dp+p[i].a*p[q[head]].b);
}
sort(p+l,p+r+1,cmp3);
cdq(mid+1,r);
}
void solve(long long u)
{
for(long long i=tre[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(v!=tre[u].fa&&v!=tre[u].son)
solve(v);
}
if(tre[u].son==0)
tre[u].dp=0;
else
solve(tre[u].son);
for(long long i=tre[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(v!=tre[u].fa&&v!=tre[u].son)
add(v);
}
pushback(u,tre[u].son!=0);
if(tre[u].top==u)
{
cdq(1,len);
for(long long i=1;i<=len;i++)
tre[p[i].dui].dp=min(p[i].dp,tre[p[i].dui].dp);
len=0;
}
}
inline void print()
{
for(long long i=1;i<=n;i++)
printf("%lld ",tre[i].dp);
}
int main()
{
readd();
tre[1].dis=1;tre[1].fa=0; tre[1].top=1;
build1(1);
build2(1);
len=0;
solve(1);
print();
return 0;
}