func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1000 * 100 + 10, LG = 20;   int n, h[N], st[N], en[N], par[N][LG], seg[N << 2], lazy[N << 2], TM, ver[N],       ans[N];   vector<int> adj[N];   struct Query {     int l, r, id;     Query(int x = 0, int y = 0, int z = 0) { l = x, r = y, id = z; }   };   vector<Query> query[N];   void dfs(int v) {     st[v] = TM++;     ver[st[v]] = h[v];     for (int i = 1; i < LG; i++) par[v][i] = par[par[v][i - 1]][i - 1];     for (auto u : adj[v])       if (u != par[v][0]) {         par[u][0] = v;         h[u] = h[v] + 1;         dfs(u);       }     en[v] = TM;   }   int k_par(int v, int k) {     for (int i = 0; i < LG; i++)       if (k >> i & 1) v = par[v][i];     return v;   }   int lca(int v, int u) {     if (h[v] < h[u]) swap(v, u);     v = k_par(v, h[v] - h[u]);     if (v == u) return v;     for (int i = LG - 1; i >= 0; i--)       if (par[v][i] != par[u][i]) v = par[v][i], u = par[u][i];     return par[v][0];   }   int d(int v, int u) { return h[v] + h[u] - 2 * h[lca(v, u)]; }   void build(int l = 0, int r = n, int id = 1) {     if (l + 1 == r) {       seg[id] = ver[l];       return;     }     int mid = l + r >> 1;     build(l, mid, id << 1), build(mid, r, id << 1 | 1);     seg[id] = max(seg[id << 1], seg[id << 1 | 1]);   }   void add(int id, int x) {     seg[id] += x;     lazy[id] += x;   }   void shift(int id) {     add(id << 1, lazy[id]);     add(id << 1 | 1, lazy[id]);     lazy[id] = 0;   }   int get(int s, int e, int l = 0, int r = n, int id = 1) {     if (s <= l && e >= r) return seg[id];     if (s >= r || e <= l) return 0;     shift(id);     int mid = l + r >> 1;     return max(get(s, e, l, mid, id << 1), get(s, e, mid, r, id << 1 | 1));   }   void upd(int s, int e, int x, int l = 0, int r = n, int id = 1) {     if (s <= l && e >= r) {       add(id, x);       return;     }     if (s >= r || e <= l) return;     shift(id);     int mid = l + r >> 1;     upd(s, e, x, l, mid, id << 1), upd(s, e, x, mid, r, id << 1 | 1);     seg[id] = max(seg[id << 1], seg[id << 1 | 1]);   }   void dfs_ans(int v) {     for (auto q : query[v]) ans[q.id] = max(ans[q.id], get(q.l, q.r));     for (auto u : adj[v])       if (u != par[v][0]) {         upd(st[u], en[u], -1);         upd(0, st[u], +1);         upd(en[u], n, +1);         dfs_ans(u);         upd(st[u], en[u], +1);         upd(0, st[u], -1);         upd(en[u], n, -1);       }   }   int main() {     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);     cin >> n;     for (int i = 1, v, u; i < n; i++) {       cin >> v >> u;       --v, --u;       adj[v].push_back(u);       adj[u].push_back(v);     }     dfs(0);     build();     int Q;     cin >> Q;     for (int i = 0, v, u; i < Q; i++) {       cin >> v >> u;       --v, --u;       if (h[v] < h[u]) swap(v, u);       int dis = d(v, u);       int w = k_par(v, (dis - 1) / 2);       query[v].push_back(Query(st[w], en[w], i));       query[u].push_back(Query(0, st[w], i));       query[u].push_back(Query(en[w], n, i));     }     dfs_ans(0);     for (int i = 0; i < Q; i++) cout << ans[i] <<   n ;     return 0;   }   