func_code_string: #include <bits/stdc++.h>   using namespace std;   int top = 0;   int N, Q, NN;   int K, M, R;   vector<int> Adj[100005];   int dep[100005];   int anc[100005][21];   int pre[100005], pst[100005], tt;   void dfs(int u) {     pre[u] = ++tt;     for (int j = 1; j <= 20; j++) {       if (dep[u] <= (1 << j)) break;       anc[u][j] = anc[anc[u][j - 1]][j - 1];     }     int v;     for (int k = 0; k < Adj[u].size(); k++) {       v = Adj[u][k];       if (v == anc[u][0]) continue;       anc[v][0] = u;       dep[v] = dep[u] + 1;       dfs(v);     }     pst[u] = ++tt;   }   int lca(int u, int v) {     if (dep[u] < dep[v]) swap(u, v);     for (int j = 20; j >= 0; j--) {       if (dep[anc[u][j]] >= dep[v]) {         u = anc[u][j];       }     }     if (u == v) return u;     for (int j = 20; j >= 0; j--) {       if (anc[u][j] != anc[v][j]) {         u = anc[u][j];         v = anc[v][j];       }     }     return anc[u][0];   }   int h[100005], c[2 * 100005];   int lbt(int x) { return x & (-x); }   void update(int x, int dv) {     for (; x <= NN; x += lbt(x)) {       c[x] += dv;     }   }   int getsum(int x) {     int ans = 0;     for (; x > 0; x -= lbt(x)) {       ans += c[x];     }     return ans;   }   bool cmp(const int& a, const int& b) { return dep[a] < dep[b]; }   int query(int u, int lca) { return getsum(pre[u] - 1) - getsum(pre[lca] - 1); }   int a[100005];   bool vis[100005];   long long dp[100005][305];   int work() {     int u, z;     for (int i = 1; i <= K; i++) {       u = a[i];       update(pre[u], 1);       update(pst[u], -1);       vis[a[i]] = 1;     }     int x;     for (int i = 1; i <= K; i++) {       u = a[i];       z = lca(u, R);       if (u == R)         h[i] = 0;       else if (u == z)         h[i] = query(R, u) - (vis[u] == true) + (vis[R] == true);       else if (z == R)         h[i] = query(u, R);       else         h[i] = query(u, z) + query(R, z) - (vis[z] == true) + (vis[R] == true);     }     sort(h + 1, h + 1 + K);     dp[1][1] = 1;     for (int i = 2; i <= K; i++) {       for (int j = 1; j <= M; j++) {         if (j > h[i])           dp[i][j] = ((long long)dp[i - 1][j] * (j - h[i]) % int(1e9 + 7) +                       dp[i - 1][j - 1]) %                      int(1e9 + 7);         else           dp[i][j] = 0;       }     }     long long ans = 0;     for (int j = 1; j <= M; j++) {       ans = (ans + dp[K][j]) % int(1e9 + 7);     }     for (int i = 1; i <= K; i++) {       u = a[i];       update(pre[u], -1);       update(pst[u], +1);       vis[a[i]] = 0;     }     return ans;   }   int main() {     scanf( %d%d , &N, &Q);     int u, v;     for (int i = 1; i < N; i++) {       scanf( %d%d , &u, &v);       Adj[u].push_back(v);       Adj[v].push_back(u);     }     dep[1] = 1;     dfs(1);     NN = 2 * N;     while (Q--) {       scanf( %d%d%d , &K, &M, &R);       for (int i = 1; i <= K; i++) {         scanf( %d , &a[i]);       }       printf( %d n , work());     }     return 0;   }   