#include<stdio.h>
#define lowbit(x) (x&-x)
#define N 100005
int n,q,w[N];
int head[N],next[N<<1],to[N<<1];
int fa[N],son[N],dep[N],size[N],top[N],num[N],pos[N];
void add(int a,int b) {
static int cnt=0;
to[++cnt]=b;
next[cnt]=head[a];
head[a]=cnt;
}
void dfs1(int t,int f,int d) {
fa[t]=f, dep[t]=d, size[t]=1;
for(int i=head[t];i;i=next[i]) {
if(to[i]!=fa[t]) {
dfs1(to[i],t,d+1);
size[t]+=size[to[i]];
if(size[to[i]]>size[son[t]]) son[t]=to[i];
}
}
}
void dfs2(int t,int tp) {
static int cnt=0;
top[t]=tp, num[t]=++cnt, pos[cnt]=t;
if(son[t]) dfs2(son[t],tp);
for(int i=head[t];i;i=next[i]) {
if(to[i]!=fa[t]&&to[i]!=son[t]) dfs2(to[i],to[i]);
}
}
void update(int t,int v) {
printf("update(%d,%d)\n",t,v);
for(;t<=n;t+=lowbit(t)) w[t]+=v;
}
int query(int t) {
printf("query(%d): ",t);
int v=0;
for(;t;t-=lowbit(t)) v+=w[t];
printf("%d\n",v);
return v;
}
int getsum(int t) {
int v=0;
while(t) {
v+=query(num[t])-query(num[top[t]]-1);
t=fa[top[t]];
}
return v;
}
int main() {
int a,b;
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++) {
scanf("%d%d",&a,&b);
add(a,b), add(b,a);
}
dfs1(1,0,1);
dfs2(1,1);
for(int i=1;i<=n;i++) {
scanf("%d",&a);
update(num[i],a);
}
while(q--) {
scanf("%d",&a);
printf("%d\n",getsum(a));
}
}
树上区间和1
最新推荐文章于 2022-07-28 16:50:16 发布