1003树
树上启发式合并暴力一下就好了
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define N 1000005
#define lowbit(x) ((x)&(-x))
template<class T>inline void read(T &res){
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
template<class T>inline void write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) {
write(x / 10);
}
putchar(x % 10 + '0');
}
int a[N+40];
int l[N+40],r[N+40];
int tot;
vector<int>g[N+40];
int dp[N+40];
int sz[N+40];
int big[N+40];
int f[3][N+40];
int b[N];
int vis[N];
int res=0;
inline void add(int c[],int x,int y){
for(int i=x;i<=N;i+=lowbit(i)){
c[i]+=y;
}
}
inline int query(int c[],int l,int r){
int res=0;
for(int i=r;i;i-=lowbit(i)){
res+=c[i];
}
for(int i=l-1;i;i-=lowbit(i)){
res-=c[i];
}
return res;
}
inline void dfs(int u, int fa)
{
//if (p != 0)
l[u] = ++tot;
a[tot]=b[u];
sz[u]=1;
vis[tot]=u;
//cout<<u<<' '<<a[tot]<<'\n';
for (auto v : g[u])
{
if (v == fa)
continue;
dfs(v, u);
sz[u]+=sz[v];
if (!big[u] || sz[big[u]] < sz[v]) big[u] = v;
}
r[u] = tot;
}
inline void dfs1(int u,int fa,bool keep){
for(int v:g[u]){
if(v!=fa&&v!=big[u]){
dfs1(v,u,false);
}
}
if(big[u]){
dfs1(big[u],u,true);
}
for(int v:g[u]){
if(v!=fa&&v!=big[u]){
for(int i=l[v];i<=r[v];i++){
add(f[0],b[vis[i]],1);//个数
add(f[1],b[vis[i]],b[vis[i]]);//数量
add(f[2],b[vis[i]],b[vis[i]]*b[vis[i]]);
res+=query(f[2],b[vis[i]],N-1)-query(f[1],b[vis[i]],N-1)*b[vis[i]];
res+=query(f[0],1,b[vis[i]]-1)*b[vis[i]]*b[vis[i]]-query(f[1],1,b[vis[i]]-1)*b[vis[i]];
}
}
}
add(f[0],b[u],1);
add(f[1],b[u],b[u]);
add(f[2],b[u],b[u]*b[u]);
res+=query(f[2],b[u],N-1)-query(f[1],b[u],N-1)*b[u];
res+=query(f[0],1,b[u]-1)*b[u]*b[u]-query(f[1],1,b[u]-1)*b[u];
dp[u]=res;
if(keep==false){
for(int i=r[u];i>=l[u];i--){
add(f[0],b[vis[i]],-1);
add(f[1],b[vis[i]],-b[vis[i]]);
add(f[2],b[vis[i]],-b[vis[i]]*b[vis[i]]);
res-=query(f[2],b[vis[i]],N-1)-query(f[1],b[vis[i]],N-1)*b[vis[i]];
res-=query(f[0],1,b[vis[i]]-1)*b[vis[i]]*b[vis[i]]-query(f[1],1,b[vis[i]]-1)*b[vis[i]];
}
}
}
void solve(){
int n;
read(n);
int u,v;
int ans=0;
for(int i=1;i<n;i++){
read(u);
read(v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++){
read(b[i]);
}
dfs(1,0);
dfs1(1,0,false);
for(int i=1;i<=n;i++){
ans^=dp[i]*2;
}
write(ans);
}
signed main() {
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
int t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}