#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500000;
int N, Q;
vector<int> tree[MAXN+1];
int up[MAXN+1][20], depth_[MAXN+1], tin[MAXN+1], tout[MAXN+1], timer_;
int sz[MAXN+1];
void dfs_init(int u, int p) {
tin[u] = ++timer_;
up[u][0] = p;
sz[u] = 1;
for (int k = 1; k < 20; k++)
up[u][k] = up[ up[u][k-1] ][k-1];
for (int v : tree[u]) if (v != p) {
depth_[v] = depth_[u] + 1;
dfs_init(v, u);
sz[u] += sz[v];
}
tout[u] = ++timer_;
}
bool is_anc(int u, int v) { // u ancestor of v?
return tin[u] <= tin[v] && tout[v] <= tout[u];
}
int lca(int u, int v) {
if (is_anc(u, v)) return u;
if (is_anc(v, u)) return v;
for (int k = 19; k >= 0; k--)
if (!is_anc(up[u][k], v))
u = up[u][k];
return up[u][0];
}
int dist_tree(int u, int v) {
int w = lca(u, v);
return depth_[u] + depth_[v] - 2*depth_[w];
}
vector<int> build_virtual_tree(vector<int> nodes, vector<vector<int>> &adj) {
sort(nodes.begin(), nodes.end(), [&](int a, int b){
return tin[a] < tin[b];
});
int m = nodes.size();
// Thêm các LCA vào
for (int i = 0; i < m-1; i++)
nodes.push_back(lca(nodes[i], nodes[i+1]));
sort(nodes.begin(), nodes.end(), [&](int a, int b){
return tin[a] < tin[b];
});
nodes.erase(unique(nodes.begin(), nodes.end()), nodes.end());
// Xây cây ảo
adj.assign(nodes.size(), {});
vector<int> st;
vector<int> idx(MAXN+1, -1);
for (int i = 0; i < (int)nodes.size(); i++) idx[nodes[i]] = i;
st.push_back(nodes[0]);
for (int i = 1; i < (int)nodes.size(); i++) {
int u = nodes[i];
while (!is_anc(st.back(), u)) st.pop_back();
int p = st.back();
adj[idx[p]].push_back(idx[u]);
adj[idx[u]].push_back(idx[p]);
st.push_back(u);
}
return nodes;
}
struct Info {
int dist, id;
};
vector<int> bfs_virtual(const vector<int> &nodes, const vector<vector<int>> &adj, const vector<int> &special) {
int m = nodes.size();
vector<Info> info(m, {INT_MAX, INT_MAX});
vector<int> idx(MAXN+1, -1);
for (int i = 0; i < m; i++) idx[nodes[i]] = i;
queue<int> q;
for (int sp : special) {
int id = idx[sp];
info[id] = {0, sp};
q.push(id);
}
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : adj[u]) {
int d = info[u].dist + dist_tree(nodes[u], nodes[v]);
if (d < info[v].dist || (d == info[v].dist && info[u].id < info[v].id)) {
info[v] = {d, info[u].id};
q.push(v);
}
}
}
vector<int> id_of(m);
for (int i = 0; i < m; i++) id_of[i] = info[i].id;
return id_of;
}
long long ans[MAXN+1];
int dp[MAXN+1];
int dfs_dp(int u, int p, const vector<int> &nodes, const vector<vector<int>> &adj, const vector<int> &id_of) {
int orig_u = nodes[u];
dp[u] = sz[orig_u];
for (int v : adj[u]) if (v != p) {
int sub = dfs_dp(v, u, nodes, adj, id_of);
if (id_of[v] == id_of[u]) dp[u] += sub;
}
ans[id_of[u]] += dp[u];
return dp[u];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N;
for (int i = 1; i <= N-1; i++) {
int u, v; cin >> u >> v;
tree[u].push_back(v);
tree[v].push_back(u);
}
depth_[1] = 0;
dfs_init(1, 1);
cin >> Q;
while (Q--) {
int m; cin >> m;
vector<int> special(m);
for (int i = 0; i < m; i++) cin >> special[i];
special.push_back(1); // thêm root
vector<vector<int>> adj;
vector<int> nodes = build_virtual_tree(special, adj);
vector<int> id_of = bfs_virtual(nodes, adj, special);
dfs_dp(0, -1, nodes, adj, id_of);
for (int x : special) if (x != 1) {
cout << ans[x] << " ";
ans[x] = 0; // reset
}
cout << "\n";
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYTiA9IDUwMDAwMDsKaW50IE4sIFE7CnZlY3RvcjxpbnQ+IHRyZWVbTUFYTisxXTsKaW50IHVwW01BWE4rMV1bMjBdLCBkZXB0aF9bTUFYTisxXSwgdGluW01BWE4rMV0sIHRvdXRbTUFYTisxXSwgdGltZXJfOwppbnQgc3pbTUFYTisxXTsKCnZvaWQgZGZzX2luaXQoaW50IHUsIGludCBwKSB7CiAgICB0aW5bdV0gPSArK3RpbWVyXzsKICAgIHVwW3VdWzBdID0gcDsKICAgIHN6W3VdID0gMTsKICAgIGZvciAoaW50IGsgPSAxOyBrIDwgMjA7IGsrKykKICAgICAgICB1cFt1XVtrXSA9IHVwWyB1cFt1XVtrLTFdIF1bay0xXTsKICAgIGZvciAoaW50IHYgOiB0cmVlW3VdKSBpZiAodiAhPSBwKSB7CiAgICAgICAgZGVwdGhfW3ZdID0gZGVwdGhfW3VdICsgMTsKICAgICAgICBkZnNfaW5pdCh2LCB1KTsKICAgICAgICBzelt1XSArPSBzelt2XTsKICAgIH0KICAgIHRvdXRbdV0gPSArK3RpbWVyXzsKfQoKYm9vbCBpc19hbmMoaW50IHUsIGludCB2KSB7IC8vIHUgYW5jZXN0b3Igb2Ygdj8KICAgIHJldHVybiB0aW5bdV0gPD0gdGluW3ZdICYmIHRvdXRbdl0gPD0gdG91dFt1XTsKfQoKaW50IGxjYShpbnQgdSwgaW50IHYpIHsKICAgIGlmIChpc19hbmModSwgdikpIHJldHVybiB1OwogICAgaWYgKGlzX2FuYyh2LCB1KSkgcmV0dXJuIHY7CiAgICBmb3IgKGludCBrID0gMTk7IGsgPj0gMDsgay0tKQogICAgICAgIGlmICghaXNfYW5jKHVwW3VdW2tdLCB2KSkKICAgICAgICAgICAgdSA9IHVwW3VdW2tdOwogICAgcmV0dXJuIHVwW3VdWzBdOwp9CgppbnQgZGlzdF90cmVlKGludCB1LCBpbnQgdikgewogICAgaW50IHcgPSBsY2EodSwgdik7CiAgICByZXR1cm4gZGVwdGhfW3VdICsgZGVwdGhfW3ZdIC0gMipkZXB0aF9bd107Cn0KCnZlY3RvcjxpbnQ+IGJ1aWxkX3ZpcnR1YWxfdHJlZSh2ZWN0b3I8aW50PiBub2RlcywgdmVjdG9yPHZlY3RvcjxpbnQ+PiAmYWRqKSB7CiAgICBzb3J0KG5vZGVzLmJlZ2luKCksIG5vZGVzLmVuZCgpLCBbJl0oaW50IGEsIGludCBiKXsKICAgICAgICByZXR1cm4gdGluW2FdIDwgdGluW2JdOwogICAgfSk7CiAgICBpbnQgbSA9IG5vZGVzLnNpemUoKTsKICAgIC8vIFRow6ptIGPDoWMgTENBIHbDoG8KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS0xOyBpKyspCiAgICAgICAgbm9kZXMucHVzaF9iYWNrKGxjYShub2Rlc1tpXSwgbm9kZXNbaSsxXSkpOwogICAgc29ydChub2Rlcy5iZWdpbigpLCBub2Rlcy5lbmQoKSwgWyZdKGludCBhLCBpbnQgYil7CiAgICAgICAgcmV0dXJuIHRpblthXSA8IHRpbltiXTsKICAgIH0pOwogICAgbm9kZXMuZXJhc2UodW5pcXVlKG5vZGVzLmJlZ2luKCksIG5vZGVzLmVuZCgpKSwgbm9kZXMuZW5kKCkpOwoKICAgIC8vIFjDonkgY8OieSDhuqNvCiAgICBhZGouYXNzaWduKG5vZGVzLnNpemUoKSwge30pOwogICAgdmVjdG9yPGludD4gc3Q7CiAgICB2ZWN0b3I8aW50PiBpZHgoTUFYTisxLCAtMSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbm9kZXMuc2l6ZSgpOyBpKyspIGlkeFtub2Rlc1tpXV0gPSBpOwoKICAgIHN0LnB1c2hfYmFjayhub2Rlc1swXSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IChpbnQpbm9kZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICBpbnQgdSA9IG5vZGVzW2ldOwogICAgICAgIHdoaWxlICghaXNfYW5jKHN0LmJhY2soKSwgdSkpIHN0LnBvcF9iYWNrKCk7CiAgICAgICAgaW50IHAgPSBzdC5iYWNrKCk7CiAgICAgICAgYWRqW2lkeFtwXV0ucHVzaF9iYWNrKGlkeFt1XSk7CiAgICAgICAgYWRqW2lkeFt1XV0ucHVzaF9iYWNrKGlkeFtwXSk7CiAgICAgICAgc3QucHVzaF9iYWNrKHUpOwogICAgfQogICAgcmV0dXJuIG5vZGVzOwp9CgpzdHJ1Y3QgSW5mbyB7CiAgICBpbnQgZGlzdCwgaWQ7Cn07Cgp2ZWN0b3I8aW50PiBiZnNfdmlydHVhbChjb25zdCB2ZWN0b3I8aW50PiAmbm9kZXMsIGNvbnN0IHZlY3Rvcjx2ZWN0b3I8aW50Pj4gJmFkaiwgY29uc3QgdmVjdG9yPGludD4gJnNwZWNpYWwpIHsKICAgIGludCBtID0gbm9kZXMuc2l6ZSgpOwogICAgdmVjdG9yPEluZm8+IGluZm8obSwge0lOVF9NQVgsIElOVF9NQVh9KTsKICAgIHZlY3RvcjxpbnQ+IGlkeChNQVhOKzEsIC0xKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSBpZHhbbm9kZXNbaV1dID0gaTsKCiAgICBxdWV1ZTxpbnQ+IHE7CiAgICBmb3IgKGludCBzcCA6IHNwZWNpYWwpIHsKICAgICAgICBpbnQgaWQgPSBpZHhbc3BdOwogICAgICAgIGluZm9baWRdID0gezAsIHNwfTsKICAgICAgICBxLnB1c2goaWQpOwogICAgfQogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBpbnQgdSA9IHEuZnJvbnQoKTsgcS5wb3AoKTsKICAgICAgICBmb3IgKGludCB2IDogYWRqW3VdKSB7CiAgICAgICAgICAgIGludCBkID0gaW5mb1t1XS5kaXN0ICsgZGlzdF90cmVlKG5vZGVzW3VdLCBub2Rlc1t2XSk7CiAgICAgICAgICAgIGlmIChkIDwgaW5mb1t2XS5kaXN0IHx8IChkID09IGluZm9bdl0uZGlzdCAmJiBpbmZvW3VdLmlkIDwgaW5mb1t2XS5pZCkpIHsKICAgICAgICAgICAgICAgIGluZm9bdl0gPSB7ZCwgaW5mb1t1XS5pZH07CiAgICAgICAgICAgICAgICBxLnB1c2godik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdmVjdG9yPGludD4gaWRfb2YobSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgaWRfb2ZbaV0gPSBpbmZvW2ldLmlkOwogICAgcmV0dXJuIGlkX29mOwp9Cgpsb25nIGxvbmcgYW5zW01BWE4rMV07CmludCBkcFtNQVhOKzFdOwoKaW50IGRmc19kcChpbnQgdSwgaW50IHAsIGNvbnN0IHZlY3RvcjxpbnQ+ICZub2RlcywgY29uc3QgdmVjdG9yPHZlY3RvcjxpbnQ+PiAmYWRqLCBjb25zdCB2ZWN0b3I8aW50PiAmaWRfb2YpIHsKICAgIGludCBvcmlnX3UgPSBub2Rlc1t1XTsKICAgIGRwW3VdID0gc3pbb3JpZ191XTsKICAgIGZvciAoaW50IHYgOiBhZGpbdV0pIGlmICh2ICE9IHApIHsKICAgICAgICBpbnQgc3ViID0gZGZzX2RwKHYsIHUsIG5vZGVzLCBhZGosIGlkX29mKTsKICAgICAgICBpZiAoaWRfb2Zbdl0gPT0gaWRfb2ZbdV0pIGRwW3VdICs9IHN1YjsKICAgIH0KICAgIGFuc1tpZF9vZlt1XV0gKz0gZHBbdV07CiAgICByZXR1cm4gZHBbdV07Cn0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgY2luID4+IE47CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOLTE7IGkrKykgewogICAgICAgIGludCB1LCB2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIHRyZWVbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIHRyZWVbdl0ucHVzaF9iYWNrKHUpOwogICAgfQogICAgZGVwdGhfWzFdID0gMDsKICAgIGRmc19pbml0KDEsIDEpOwoKICAgIGNpbiA+PiBROwogICAgd2hpbGUgKFEtLSkgewogICAgICAgIGludCBtOyBjaW4gPj4gbTsKICAgICAgICB2ZWN0b3I8aW50PiBzcGVjaWFsKG0pOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSBjaW4gPj4gc3BlY2lhbFtpXTsKICAgICAgICBzcGVjaWFsLnB1c2hfYmFjaygxKTsgLy8gdGjDqm0gcm9vdAoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGFkajsKICAgICAgICB2ZWN0b3I8aW50PiBub2RlcyA9IGJ1aWxkX3ZpcnR1YWxfdHJlZShzcGVjaWFsLCBhZGopOwoKICAgICAgICB2ZWN0b3I8aW50PiBpZF9vZiA9IGJmc192aXJ0dWFsKG5vZGVzLCBhZGosIHNwZWNpYWwpOwoKICAgICAgICBkZnNfZHAoMCwgLTEsIG5vZGVzLCBhZGosIGlkX29mKTsKCiAgICAgICAgZm9yIChpbnQgeCA6IHNwZWNpYWwpIGlmICh4ICE9IDEpIHsKICAgICAgICAgICAgY291dCA8PCBhbnNbeF0gPDwgIiAiOwogICAgICAgICAgICBhbnNbeF0gPSAwOyAvLyByZXNldAogICAgICAgIH0KICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICB9Cn0K