func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e5 + 5, maxm = 4e5 + 5;   int head[maxn], nume;   struct edge {     int v, w, c, next;   } e[maxm];   inline void init_edge() {     memset(head, -1, sizeof head);     nume = 0;   }   inline void add_edge(int u, int v, int w = 0, int c = 0) {     e[nume].v = v;     e[nume].w = w;     e[nume].c = c;     e[nume].next = head[u];     head[u] = nume++;   }   int dep[maxn], dp[maxn][20], numpow = 19;   void dfs(int u, int f) {     dep[u] = dep[f] + 1;     dp[u][0] = f;     for (int i = 1; i <= numpow; ++i) dp[u][i] = dp[dp[u][i - 1]][i - 1];     for (int i = head[u]; ~i; i = e[i].next) {       int v = e[i].v;       if (v == f) continue;       dfs(v, u);     }   }   int lca(int u, int v) {     if (dep[u] > dep[v]) swap(u, v);     if (dep[u] < dep[v]) {       int tmp = dep[v] - dep[u];       for (int i = 0; i <= numpow; ++i)         if (tmp & (1 << i)) v = dp[v][i];     }     if (u != v) {       for (int i = numpow; ~i; --i)         if (dp[u][i] != dp[v][i]) u = dp[u][i], v = dp[v][i];       u = v = dp[u][0];     }     return u;   }   int ff(int u, int num) {     for (int i = 0; (1 << i) <= num; i++) {       if (num & (1 << i)) u = dp[u][i];     }     return u;   }   int f[maxn];   int find(int x) {     if (x == f[x]) return x;     return f[x] = find(f[x]);   }   int he(int u, int v) {     u = find(u);     v = find(v);     if (u != v) f[u] = v;   }   queue<int> que;   int n, k, r, q;   int vis[maxn];   int main() {     scanf( %d%d%d , &n, &k, &r);     init_edge();     for (int i = 1; i < n; i++) {       int u, v;       scanf( %d%d , &u, &v);       add_edge(u, v);       add_edge(v, u);     }     memset(vis, -1, sizeof vis);     for (int i = 1; i <= r; i++) {       int u;       scanf( %d , &u);       vis[u] = 0;       que.push(u);     }     while (!que.empty()) {       int u = que.front();       que.pop();       for (int i = head[u]; ~i; i = e[i].next) {         int v = e[i].v;         if (vis[v] == -1) {           vis[v] = vis[u] + 1;           que.push(v);         }       }     }     for (int i = 1; i <= n; i++) f[i] = i;     for (int u = 1; u <= n; u++) {       for (int i = head[u]; ~i; i = e[i].next) {         int v = e[i].v;         if (vis[u] + vis[v] < k) {           he(u, v);         }       }     }     dfs(1, 0);     scanf( %d , &q);     while (q--) {       int u, v, Lca, U, V;       scanf( %d%d , &u, &v);       Lca = lca(u, v);       if (dep[u] + dep[v] - 2 * dep[Lca] <= k)         printf( YES n );       else {         if (dep[u] - dep[Lca] >= (k + 1) / 2)           U = ff(u, (k + 1) / 2);         else           U = ff(v, dep[u] + dep[v] - 2 * dep[Lca] - (k + 1) / 2);         if (dep[v] - dep[Lca] >= (k + 1) / 2)           V = ff(v, (k + 1) / 2);         else           V = ff(u, dep[u] + dep[v] - 2 * dep[Lca] - (k + 1) / 2);         if (find(U) == find(V) && vis[U] <= k / 2 && vis[V] <= k / 2)           printf( YES n );         else           printf( NO n );       }     }   }   