#include #include #include #include #include #include using namespace std; #define repe(i,now) for(int i=head[now];i!=-1;i=edge[i].next) #define rep(i,s,t) for(int i=s;i0){ a+=c[x];x-=lowbit(x); } return a; } inline void addEdge(int u,int v){ edge[e].v=v; edge[e].next=head[u]; head[u]=e++; } inline void dfs(int now,int pre){ to[now]=(++cnt);rTo[cnt]=now; fa[now][0]=pre; dep[now]=dep[pre]+1; rep(i,1,20) fa[now][i]=fa[fa[now][i-1]][i-1]; repe(i,now){ int nxt=edge[i].v; if(nxt!=pre){ dfs(nxt,now); } } last[now]=cnt; } inline int lca(int a,int b){ if(dep[a]>dep[b]) swap(a,b); int ha=dep[a],hb=dep[b]; int ta=a,tb=b; int det=hb-ha; rep(i,0,20){ if(det&(1<=0;i--){ if(fa[ta][i]==fa[tb][i]) continue; ta=fa[ta][i]; tb=fa[tb][i]; } return fa[ta][0]; } inline void Init(){ scanf("%d",&n); clr(head,-1),e=all=cnt=0; r=1; rep(i,1,n){ scanf("%d%d",&a,&b); addEdge(a,b); addEdge(b,a); } rep(i,1,n+1) scanf("%d",&v[i]),all+=v[i]; fa[1][0]=1; dep[0]=0; dfs(1,0); } inline int find(int x,int y){ int det=dep[y]-dep[x]-1; rep(i,0,20){ if(det&(1<