#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using Int = long long; template ostream &operator<<(ostream &os, const pair &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template ostream &operator<<(ostream &os, const vector &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; } template void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } int N; vector A, B; vector> graph; vector par, dep, sz; void dfs(int u, int p) { par[u] = p; dep[u] = ~p ? (dep[p] + 1) : 0; sz[u] = 1; for (const int v : graph[u]) if (p != v) { dfs(v, u); sz[u] += sz[v]; } } // par, dep // N <= 2^E constexpr int E = 18; int ppar[E][200'010]; int lca(int u, int v) { for (int e = E; --e >= 0; ) { if (dep[u] - (1 << e) >= dep[v]) { u = ppar[e][u]; } if (dep[v] - (1 << e) >= dep[u]) { v = ppar[e][v]; } } for (int e = E; --e >= 0; ) { if (ppar[e][u] != ppar[e][v]) { u = ppar[e][u]; v = ppar[e][v]; } } if (u != v) { u = ppar[0][u]; v = ppar[0][v]; } return u; } int up(int u, int d) { assert(dep[u] >= d); for (int e = E; --e >= 0; ) if (d >> e & 1) u = ppar[e][u]; return u; } int main() { int Q; for (; ~scanf("%d%d", &N, &Q); ) { A.resize(N - 1); B.resize(N - 1); for (int i = 0; i < N - 1; ++i) { scanf("%d%d", &A[i], &B[i]); --A[i]; --B[i]; } graph.assign(N, {}); for (int i = 0; i < N - 1; ++i) { graph[A[i]].push_back(B[i]); graph[B[i]].push_back(A[i]); } par.assign(N, -1); dep.assign(N, -1); sz.assign(N, -1); dfs(0, -1); copy(par.begin(), par.end(), ppar[0]); for (int e = 0; e < E - 1; ++e) { for (int u = 0; u < N; ++u) { const int p = ppar[e][u]; ppar[e + 1][u] = (~p) ? ppar[e][p] : -1; } } for (int q = 0; q < Q; ++q) { int S, T; scanf("%d%d", &S, &T); --S; --T; int ans = 0; const int l = lca(S, T); const int ds = dep[S] - dep[l]; const int dt = dep[T] - dep[l]; if ((ds + dt) % 2 == 0) { const int d = (ds + dt) / 2; if (ds > dt) { ans += sz[up(S, d)]; ans -= sz[up(S, d - 1)]; } else if (ds < dt) { ans += sz[up(T, d)]; ans -= sz[up(T, d - 1)]; } else { ans += sz[l]; ans -= sz[up(S, d - 1)]; ans -= sz[up(T, d - 1)]; } } printf("%d\n", ans); } } return 0; }