func_code_string: #include <bits/stdc++.h>   using namespace std;   const long double PI = 3.1415926535897932384626433832795;   template <typename S, typename T>   ostream& operator<<(ostream& out, pair<S, T> const& p) {     out <<  (  << p.first <<  ,   << p.second <<  ) ;     return out;   }   template <typename T>   ostream& operator<<(ostream& out, vector<T> const& v) {     int l = v.size();     for (int i = 0; i < l - 1; i++) out << v[i] <<    ;     if (l > 0) out << v[l - 1];     return out;   }   void tr() { cout << endl; }   template <typename S, typename... Strings>   void tr(S x, const Strings&... rest) {     cout << x <<    ;     tr(rest...);   }   const int LOGN = 17;   const int N = 1 << LOGN;   int n, m;   vector<int> g[N];   int p[LOGN][N], l[N];   int sz[N];   int beg[N], e[N], tme;   vector<pair<pair<int, int>, int> > seg[N];   int LCA(int x, int y) {     if (l[x] < l[y]) swap(x, y);     int tmp = 1;     while ((1 << tmp) <= l[x]) tmp++;     tmp--;     for (int i = tmp; i >= 0; i--)       if (l[x] - (1 << i) >= l[y]) x = p[i][x];     if (x == y) return y;     for (int i = tmp; i >= 0; i--)       if (p[i][x] > 0 and p[i][x] != p[i][y]) x = p[i][x], y = p[i][y];     return p[0][x];   }   int getAncestorAtH(int x, int h) {     if (l[x] == h) return x;     int del = l[x] - h, tmp = 0;     while ((1 << tmp) <= del) tmp++;     tmp--;     while (true) {       if (l[x] == h) return x;       if (l[p[tmp][x]] >= h) x = p[tmp][x];       tmp--;     }   }   void dfs(int cur, int prev) {     beg[cur] = ++tme;     sz[cur] = 1;     p[0][cur] = prev;     for (__typeof((g[cur]).begin()) it = (g[cur]).begin(); it != (g[cur]).end();          ++it) {       if (*it == prev) continue;       l[*it] = l[cur] + 1;       dfs(*it, cur);       sz[cur] += sz[*it];       seg[cur].push_back(make_pair(make_pair(beg[*it], e[*it]), *it));     }     sort(seg[cur].begin(), seg[cur].end());     e[cur] = ++tme;   }   int main() {     scanf( %d , &n);     for (int i = 1; i < n; i++) {       int u, v;       scanf( %d%d , &u, &v);       g[u].push_back(v);       g[v].push_back(u);     }     dfs(1, 1);     for (int i = 1; i < LOGN; i++) {       for (int j = 1; j <= n; j++) {         p[i][j] = p[i - 1][p[i - 1][j]];       }     }     scanf( %d , &m);     while (m--) {       int x, y;       scanf( %d%d , &x, &y);       if (x == y) {         printf( %d n , n);         continue;       }       int z = LCA(x, y);       if (z == x or z == y) {         if (z == y) swap(x, y);         int del = l[y] - l[x];         if (del % 2) {           printf( 0 n );           continue;         }         del /= 2;         int h = l[y] - del;         z = getAncestorAtH(y, h);         int i = lower_bound(seg[z].begin(), seg[z].end(),                             make_pair(make_pair(beg[y], (int)1e9), (int)1e9)) -                 seg[z].begin() - 1;         printf( %d n , sz[z] - sz[seg[z][i].second]);         continue;       }       int del = l[x] - l[z] + l[y] - l[z];       if (del % 2) {         printf( 0 n );         continue;       }       del /= 2;       if (l[x] - del < l[z]) swap(x, y);       int tmp = z;       z = getAncestorAtH(x, l[x] - del);       int i = lower_bound(seg[z].begin(), seg[z].end(),                           make_pair(make_pair(beg[x], (int)1e9), (int)1e9)) -               seg[z].begin() - 1;       int res = sz[z] - sz[seg[z][i].second];       if (z == tmp) {         i = lower_bound(seg[z].begin(), seg[z].end(),                         make_pair(make_pair(beg[y], (int)1e9), (int)1e9)) -             seg[z].begin() - 1;         res -= sz[seg[z][i].second];         res += n - sz[z];       }       printf( %d n , res);     }     return 0;   }   