#include using namespace std; int main() { int n, q; cin >> n >> q; vector> g(n); for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; --u, --v; g[u].push_back(v); g[v].push_back(u); } vector sz(n), par(n), tin(n), tout(n), dep(n); int _t; auto dfs = [&] (auto&& self, int u, int p) -> void { dep[u] = dep[p] + 1; par[u] = p; sz[u] = 1; tin[u] = _t++; for (int v : g[u]) if (v != p) { self(self, v, u); sz[u] += sz[v]; } tout[u] = _t; }; dfs(dfs, 0, 0); int lg = __lg(n) + 1; vector table(lg, par); for (int p = 1; p < lg; p++) { for (int i = 0; i < n; i++) { table[p][i] = table[p - 1][table[p - 1][i]]; } } auto f_k = [&] (int u, int k) { for (int p = 0; p < lg; p++) { if (k >> p & 1) { u = table[p][u]; } } return u; }; auto lca = [&] (int u, int v) { if (dep[u] > dep[v]) swap(u, v); int d = dep[v] - dep[u]; for (int p = 0; p < lg; p++) { if (d >> p & 1) { v = table[p][v]; } } if (u == v) return u; for (int p = lg - 1; p >= 0; p--) { if (table[p][u] != table[p][v]) { u = table[p][u]; v = table[p][v]; } } return par[u]; }; while (q--) { int u, v; cin >> u >> v; --u, --v; if (dep[u] > dep[v]) swap(u, v); if (tin[u] <= tin[v] && tout[v] <= tout[u]) { // u is ancestor of v int dist = dep[v] - dep[u]; if (dist % 2) { cout << 0 << endl; continue; } int mid = f_k(v, dist / 2); int mid2 = f_k(v, dist / 2 - 1); cout << sz[mid] - sz[mid2] << endl; continue; } int l = lca(u, v); int du = dep[u] - dep[l]; int dv = dep[v] - dep[l]; int dist = du + dv; if (dist % 2) { cout << 0 << endl; continue; } if (du == dv) { int lu = f_k(u, du - 1); int lv = f_k(v, dv - 1); cout << sz[l] - sz[lu] - sz[lv] << endl; } else { int ref = (du > dv ? u : v); int mid = f_k(ref, dist / 2); int mid2 = f_k(ref, dist / 2 - 1); cout << sz[mid] - sz[mid2] << endl; } } }