代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
const int mod = 1e9 + 7;
struct GRAPH
{
int head[N], nxt[N << 1], to[N << 1], tot;
void add(int x, int y)
{
nxt[++tot] = head[x];
to[tot] = y;
head[x] = tot;
}
} gr;
int f[N][30][2], n, q, k, a[N], st[N], top;
void dfs(int u, int fa)
{
st[++top] = u;
for (int j = 0; j < 30; j++)
{
f[u][j][(a[u] >> j) & 1]++;
}
if (top > k + 1)
for (int j = 0; j < 30; j++)
f[st[top - k - 1]][j][(a[u] >> j) & 1]--;
for (int i = gr.head[u]; i; i = gr.nxt[i])
{
int v = gr.to[i];
if (v == fa)
continue;
dfs(v, u);
}
top--;
}
void dfs_sum(int u, int fa)
{
for (int i = gr.head[u]; i; i = gr.nxt[i])
{
int v = gr.to[i];
if (v == fa)
continue;
dfs_sum(v, u);
for (int j = 0; j < 30; j++)
{
f[u][j][0] += f[v][j][0];
f[u][j][1] += f[v][j][1];
}
}
}
int main()
{
cin >> n >> q >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i < n; i++)
{
int x, y;
cin >> x >> y;
gr.add(x, y);
gr.add(y, x);
}
dfs(1, 0);
dfs_sum(1, 0);
while (q--)
{
int x;
cin >> x;
int ans = 0;
;
for (int j = 0; j < 30; j++)
{
ans += 1ll * f[x][j][0] * f[x][j][1] % mod * (1 << j) % mod;
ans %= mod;
}
cout << ans << endl;
}
return 0;
}