#include #include #include #include #include #include #include #include #include #include #define mkp make_pair #define mkt make_tuple #define rep(i,n) for(int i = 0; i < (n); ++i) using namespace std; typedef long long ll; const ll MOD=1e9+7; template void chmin(T &a,const T &b){if(a>b) a=b;} template void chmax(T &a,const T &b){if(a> g; vector par,dep; vector in,out; vector order,trans; vector start;// don't init int D; int times; BFS_EulerTour(int V):g(V),par(V),dep(V),in(V),out(V),order(V),trans(V){} void add_edge(int a,int b){ g[a].push_back(b); g[b].push_back(a); } void dfs(int now,int p,int d){ in[now]=times++; dep[now]=d; par[now]=p; for(auto nex:g[now]) if(nex!=p) dfs(nex,now,d+1); out[now]=times; } void build(int root){ times=0; dfs(root,-1,0); D=*max_element(dep.begin(),dep.end())+1; queue Q; Q.push(root); start.resize(D+1,-1); int cnt=0; while(!Q.empty()){ int now=Q.front();Q.pop(); if(start[dep[now]]==-1) start[dep[now]]=cnt; order[cnt]=now; trans[now]=cnt++; for(auto nex:g[now]) if(nex!=par[now]){ Q.push(nex); } } start[D]=(int)order.size(); } int lower_bound(int l,int r,int tar){//[l,r) int ok=r,ng=l-1; while(abs(ok-ng)>1){ int mid=(ok+ng)/2; if(tar<=in[order[mid]]) ok=mid; else ng=mid; } return ok; } pair range(int v,int d){ if(dep[v]+d>=D) return {0,0}; int l=start[dep[v]+d]; int r=start[dep[v]+d+1]; return {lower_bound(l,r,in[v]),lower_bound(l,r,out[v])}; } }; class LazySegmentTree{ private: int n; vector node,lazy; vector lz_flag; public: LazySegmentTree(vector v){ n=1; while(n=0;i--) node[i]=node[2*i+1]+node[2*i+2]; } void eval(int k,int l,int r){ if(lz_flag[k]){ node[k]=lazy[k]*(r-l); if(r-l>1){ lz_flag[2*k+1]=1; lazy[2*k+1]=lazy[k]; lz_flag[2*k+2]=1; lazy[2*k+2]=lazy[k]; } lz_flag[k]=0; } } void update(int a,int b,ll x,int k=0,int l=0,int r=-1){ if(r<0) r=n; eval(k,l,r); if(b<=l||r<=a) return; if(a<=l&&r<=b){ lazy[k]=x; lz_flag[k]=1; eval(k,l,r); }else{ update(a,b,x,2*k+1,l,(r+l)/2); update(a,b,x,2*k+2,(r+l)/2,r); node[k]=node[2*k+1]+node[2*k+2]; } } ll getSum(int a,int b,int k=0,int l=0,int r=-1){ if(r<0) r=n; eval(k,l,r); if(b<=l||r<=a) return 0; if(a<=l&&r<=b) return node[k]; ll vl,vr; vl=getSum(a,b,2*k+1,l,(l+r)/2); vr=getSum(a,b,2*k+2,(l+r)/2,r); return vl+vr; } }; int main(){ cin.tie(0); ios::sync_with_stdio(false); int N; cin>>N; BFS_EulerTour eul(N); rep(i,N-1){ int a,b; cin>>a>>b; eul.add_edge(a,b); } vector A(N); rep(i,N) cin>>A[i]; eul.build(0); vector v(N,0); rep(i,N) v[eul.trans[i]]=A[i]; LazySegmentTree seg(v); auto query=[&](int now,int d,ll &sum){ int l,r; tie(l,r)=eul.range(now,d); sum+=seg.getSum(l,r); seg.update(l,r,0); }; int Q; cin>>Q; rep(q,Q){ int x; cin>>x; ll ans=0; if(eul.par[x]!=-1){ int p=eul.par[x]; if(eul.par[p]!=-1) query(eul.par[p],0,ans); query(p,0,ans); query(p,1,ans); }else query(x,0,ans); query(x,1,ans); query(x,2,ans); cout<