// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
template<class T>
bool minimize(T &a, const T &b) {
if (a > b) return a = b, true;
return false;
}
template<class T>
bool maximize(T &a, const T &b) {
if (a < b) return a = b, true;
return false;
}
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "gen"
const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const ll INF = 1e18 + 27092008;
const int N = 1e5 + 5;
struct Node {
int distLeft, distRight, minHigh, maxHigh;
Node(int _distLeft = -inf, int _distRight = -inf, int _minHigh = inf, int _maxHigh = -inf):
distLeft(_distLeft), distRight(_distRight), minHigh(_minHigh), maxHigh(_maxHigh) {}
friend Node combine(const Node &L, const Node &R) {
Node res;
res.distLeft = max({L.distLeft, R.distLeft, L.maxHigh - 2 * R.minHigh});
res.distRight = max({L.distRight, R.distRight, R.maxHigh - 2 * L.minHigh});
res.maxHigh = max(L.maxHigh, R.maxHigh);
res.minHigh = min(L.minHigh, R.minHigh);
return res;
}
} node[N << 2];
int numNode, numQuery;
vector<int> G[N];
int tour[N], timeIn[N], timeOut[N], high[N], par[N][18], lenTour;
void dfs(int u) {
timeIn[u] = ++lenTour;
tour[lenTour] = u;
for(int v : G[u]) if (v != par[u][0]) {
high[v] = high[u] + 1;
par[v][0] = u;
dfs(v);
tour[++lenTour] = u;
}
timeOut[u] = lenTour;
}
int jump(int u, int k) {
if (k <= 0) return u;
REP(j, 18) if (BIT(k, j))
u = par[u][j];
return u;
}
int LCA(int u, int v) {
if (high[u] < high[v]) swap(u, v);
u = jump(u, high[u] - high[v]);
if (u == v) return u;
RED(j, 18) if (par[u][j] != par[v][j]) {
u = par[u][j];
v = par[v][j];
}
return par[u][0];
}
int dist(int u, int v) {
int p = LCA(u, v);
return high[u] + high[v] - 2 * high[p];
}
void build(int id, int l, int r) {
if (l == r) {
node[id].maxHigh = node[id].minHigh = high[tour[l]];
node[id].distLeft = node[id].distRight = -high[tour[l]];
return;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
node[id] = combine(node[id << 1], node[id << 1 | 1]);
}
Node getDist(int id, int l, int r, int u, int v) {
if (l > v || r < u || u > v) return Node();
if (u <= l && r <= v) return node[id];
int mid = (l + r) >> 1;
Node L = getDist(id << 1, l, mid, u, v);
Node R = getDist(id << 1 | 1, mid + 1, r, u, v);
return combine(L, R);
}
int maxDist(int node, int l, int r) {
if (l > r) return 0;
Node L = getDist(1, 1, lenTour, l, min(timeIn[node], r));
Node R = getDist(1, 1, lenTour, max(l, timeIn[node]), r);
return max(L.distLeft, R.distRight) + high[node];
}
void init(void) {
cin >> numNode;
FOR(i, 1, numNode) G[i].clear();
FOR(i, 2, numNode) {
int u, v;
cin >> u >> v;
G[u].pb(v);
G[v].pb(u);
}
}
void process(void) {
lenTour = 0;
dfs(1);
FOR(j, 1, 17) FOR(i, 1, numNode)
par[i][j] = par[par[i][j - 1]][j - 1];
FOR(i, 1, 4 * numNode) node[i] = Node();
build(1, 1, lenTour);
cin >> numQuery;
while(numQuery--) {
int u, v;
cin >> u >> v;
if (high[u] < high[v]) swap(u, v);
int w = jump(u, dist(u, v) / 2), ans = 0;
if (w == LCA(u, v)) w = jump(u, high[u] - high[w] - 1);
maximize(ans, maxDist(u, timeIn[w], timeOut[w]));
if (timeIn[v] < timeIn[w]) {
maximize(ans, maxDist(v, 1, timeIn[v]));
Node L = getDist(1, 1, lenTour, timeIn[v], timeIn[w] - 1);
Node R = getDist(1, 1, lenTour, timeOut[w] + 1, lenTour);
Node res = combine(L, R);
maximize(ans, res.distRight + high[v]);
} else if (timeIn[w] <= timeIn[v] && timeOut[v] <= timeOut[w]) {
maximize(ans, maxDist(v, 1, timeIn[w] - 1));
maximize(ans, maxDist(v, timeOut[w] + 1, lenTour));
} else {
maximize(ans, maxDist(v, timeIn[v], lenTour));
Node L = getDist(1, 1, lenTour, 1, timeIn[w] - 1);
Node R = getDist(1, 1, lenTour, timeOut[w] + 1, timeIn[v]);
Node res = combine(L, R);
maximize(ans, res.distLeft + high[v]);
}
cout << ans << '\n';
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int tc = 1;
cin >> tc;
while(tc--) {
init();
process();
}
return 0;
}
Ly8gfn4gaWNlYmVhciB+fgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOwp0eXBlZGVmIHBhaXI8aW50LCBpaT4gaWlpOwoKdGVtcGxhdGU8Y2xhc3MgVD4KICAgIGJvb2wgbWluaW1pemUoVCAmYSwgY29uc3QgVCAmYikgewogICAgICAgIGlmIChhID4gYikgcmV0dXJuIGEgPSBiLCB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCnRlbXBsYXRlPGNsYXNzIFQ+CiAgICBib29sIG1heGltaXplKFQgJmEsIGNvbnN0IFQgJmIpIHsKICAgICAgICBpZiAoYSA8IGIpIHJldHVybiBhID0gYiwgdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgojZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgRk9SUihpLGEsYikgZm9yKGludCBpPShhKTsgaT49KGIpOyAtLWkpCiNkZWZpbmUgUkVQKGksIG4pIGZvcihpbnQgaT0wOyBpPChuKTsgKytpKQojZGVmaW5lIFJFRChpLCBuKSBmb3IoaW50IGk9KG4pLTE7IGk+PTA7IC0taSkKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIEJJVChTLCBpKSAoKChTKSA+PiAoaSkpICYgMSkKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGFsbCh4KSB4LmJlZ2luKCksIHguZW5kKCkKI2RlZmluZSB0YXNrICJnZW4iCgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKY29uc3QgaW50IGluZiA9IDFlOSArIDI3MDkyMDA4Owpjb25zdCBsbCBJTkYgPSAxZTE4ICsgMjcwOTIwMDg7CmNvbnN0IGludCBOID0gMWU1ICsgNTsKc3RydWN0IE5vZGUgewogICAgaW50IGRpc3RMZWZ0LCBkaXN0UmlnaHQsIG1pbkhpZ2gsIG1heEhpZ2g7CiAgICBOb2RlKGludCBfZGlzdExlZnQgPSAtaW5mLCBpbnQgX2Rpc3RSaWdodCA9IC1pbmYsIGludCBfbWluSGlnaCA9IGluZiwgaW50IF9tYXhIaWdoID0gLWluZik6CiAgICAgICAgZGlzdExlZnQoX2Rpc3RMZWZ0KSwgZGlzdFJpZ2h0KF9kaXN0UmlnaHQpLCBtaW5IaWdoKF9taW5IaWdoKSwgbWF4SGlnaChfbWF4SGlnaCkge30KCiAgICBmcmllbmQgTm9kZSBjb21iaW5lKGNvbnN0IE5vZGUgJkwsIGNvbnN0IE5vZGUgJlIpIHsKICAgICAgICBOb2RlIHJlczsKICAgICAgICByZXMuZGlzdExlZnQgPSBtYXgoe0wuZGlzdExlZnQsIFIuZGlzdExlZnQsIEwubWF4SGlnaCAtIDIgKiBSLm1pbkhpZ2h9KTsKICAgICAgICByZXMuZGlzdFJpZ2h0ID0gbWF4KHtMLmRpc3RSaWdodCwgUi5kaXN0UmlnaHQsIFIubWF4SGlnaCAtIDIgKiBMLm1pbkhpZ2h9KTsKICAgICAgICByZXMubWF4SGlnaCA9IG1heChMLm1heEhpZ2gsIFIubWF4SGlnaCk7CiAgICAgICAgcmVzLm1pbkhpZ2ggPSBtaW4oTC5taW5IaWdoLCBSLm1pbkhpZ2gpOwogICAgICAgIHJldHVybiByZXM7CiAgICB9Cn0gbm9kZVtOIDw8IDJdOwppbnQgbnVtTm9kZSwgbnVtUXVlcnk7CnZlY3RvcjxpbnQ+IEdbTl07CmludCB0b3VyW05dLCB0aW1lSW5bTl0sIHRpbWVPdXRbTl0sIGhpZ2hbTl0sIHBhcltOXVsxOF0sIGxlblRvdXI7Cgp2b2lkIGRmcyhpbnQgdSkgewogICAgdGltZUluW3VdID0gKytsZW5Ub3VyOwogICAgdG91cltsZW5Ub3VyXSA9IHU7CiAgICBmb3IoaW50IHYgOiBHW3VdKSBpZiAodiAhPSBwYXJbdV1bMF0pIHsKICAgICAgICBoaWdoW3ZdID0gaGlnaFt1XSArIDE7CiAgICAgICAgcGFyW3ZdWzBdID0gdTsKICAgICAgICBkZnModik7CiAgICAgICAgdG91clsrK2xlblRvdXJdID0gdTsKICAgIH0KICAgIHRpbWVPdXRbdV0gPSBsZW5Ub3VyOwp9CgppbnQganVtcChpbnQgdSwgaW50IGspIHsKICAgIGlmIChrIDw9IDApIHJldHVybiB1OwogICAgUkVQKGosIDE4KSBpZiAoQklUKGssIGopKQogICAgICAgIHUgPSBwYXJbdV1bal07CiAgICByZXR1cm4gdTsKfQoKaW50IExDQShpbnQgdSwgaW50IHYpIHsKICAgIGlmIChoaWdoW3VdIDwgaGlnaFt2XSkgc3dhcCh1LCB2KTsKICAgIHUgPSBqdW1wKHUsIGhpZ2hbdV0gLSBoaWdoW3ZdKTsKICAgIGlmICh1ID09IHYpIHJldHVybiB1OwogICAgUkVEKGosIDE4KSBpZiAocGFyW3VdW2pdICE9IHBhclt2XVtqXSkgewogICAgICAgIHUgPSBwYXJbdV1bal07CiAgICAgICAgdiA9IHBhclt2XVtqXTsKICAgIH0KICAgIHJldHVybiBwYXJbdV1bMF07Cn0KCmludCBkaXN0KGludCB1LCBpbnQgdikgewogICAgaW50IHAgPSBMQ0EodSwgdik7CiAgICByZXR1cm4gaGlnaFt1XSArIGhpZ2hbdl0gLSAyICogaGlnaFtwXTsKfQoKdm9pZCBidWlsZChpbnQgaWQsIGludCBsLCBpbnQgcikgewogICAgaWYgKGwgPT0gcikgewogICAgICAgIG5vZGVbaWRdLm1heEhpZ2ggPSBub2RlW2lkXS5taW5IaWdoID0gaGlnaFt0b3VyW2xdXTsKICAgICAgICBub2RlW2lkXS5kaXN0TGVmdCA9IG5vZGVbaWRdLmRpc3RSaWdodCA9IC1oaWdoW3RvdXJbbF1dOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICBidWlsZChpZCA8PCAxLCBsLCBtaWQpOwogICAgYnVpbGQoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIpOwogICAgbm9kZVtpZF0gPSBjb21iaW5lKG5vZGVbaWQgPDwgMV0sIG5vZGVbaWQgPDwgMSB8IDFdKTsKfQoKTm9kZSBnZXREaXN0KGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpIHsKICAgIGlmIChsID4gdiB8fCByIDwgdSB8fCB1ID4gdikgcmV0dXJuIE5vZGUoKTsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gbm9kZVtpZF07CiAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgTm9kZSBMID0gZ2V0RGlzdChpZCA8PCAxLCBsLCBtaWQsIHUsIHYpOwogICAgTm9kZSBSID0gZ2V0RGlzdChpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgdSwgdik7CiAgICByZXR1cm4gY29tYmluZShMLCBSKTsKfQoKaW50IG1heERpc3QoaW50IG5vZGUsIGludCBsLCBpbnQgcikgewogICAgaWYgKGwgPiByKSByZXR1cm4gMDsKICAgIE5vZGUgTCA9IGdldERpc3QoMSwgMSwgbGVuVG91ciwgbCwgbWluKHRpbWVJbltub2RlXSwgcikpOwogICAgTm9kZSBSID0gZ2V0RGlzdCgxLCAxLCBsZW5Ub3VyLCBtYXgobCwgdGltZUluW25vZGVdKSwgcik7CiAgICByZXR1cm4gbWF4KEwuZGlzdExlZnQsIFIuZGlzdFJpZ2h0KSArIGhpZ2hbbm9kZV07Cn0KCnZvaWQgaW5pdCh2b2lkKSB7CiAgICBjaW4gPj4gbnVtTm9kZTsKICAgIEZPUihpLCAxLCBudW1Ob2RlKSBHW2ldLmNsZWFyKCk7CiAgICBGT1IoaSwgMiwgbnVtTm9kZSkgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgR1t1XS5wYih2KTsKICAgICAgICBHW3ZdLnBiKHUpOwogICAgfQp9Cgp2b2lkIHByb2Nlc3Modm9pZCkgewogICAgbGVuVG91ciA9IDA7CiAgICBkZnMoMSk7CiAgICBGT1IoaiwgMSwgMTcpIEZPUihpLCAxLCBudW1Ob2RlKQogICAgICAgIHBhcltpXVtqXSA9IHBhcltwYXJbaV1baiAtIDFdXVtqIC0gMV07CgogICAgRk9SKGksIDEsIDQgKiBudW1Ob2RlKSBub2RlW2ldID0gTm9kZSgpOwogICAgYnVpbGQoMSwgMSwgbGVuVG91cik7CgogICAgY2luID4+IG51bVF1ZXJ5OwogICAgd2hpbGUobnVtUXVlcnktLSkgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgaWYgKGhpZ2hbdV0gPCBoaWdoW3ZdKSBzd2FwKHUsIHYpOwoKICAgICAgICBpbnQgdyA9IGp1bXAodSwgZGlzdCh1LCB2KSAvIDIpLCBhbnMgPSAwOwogICAgICAgIGlmICh3ID09IExDQSh1LCB2KSkgdyA9IGp1bXAodSwgaGlnaFt1XSAtIGhpZ2hbd10gLSAxKTsKCiAgICAgICAgbWF4aW1pemUoYW5zLCBtYXhEaXN0KHUsIHRpbWVJblt3XSwgdGltZU91dFt3XSkpOwoKICAgICAgICBpZiAodGltZUluW3ZdIDwgdGltZUluW3ddKSB7CiAgICAgICAgICAgIG1heGltaXplKGFucywgbWF4RGlzdCh2LCAxLCB0aW1lSW5bdl0pKTsKICAgICAgICAgICAgTm9kZSBMID0gZ2V0RGlzdCgxLCAxLCBsZW5Ub3VyLCB0aW1lSW5bdl0sIHRpbWVJblt3XSAtIDEpOwogICAgICAgICAgICBOb2RlIFIgPSBnZXREaXN0KDEsIDEsIGxlblRvdXIsIHRpbWVPdXRbd10gKyAxLCBsZW5Ub3VyKTsKICAgICAgICAgICAgTm9kZSByZXMgPSBjb21iaW5lKEwsIFIpOwogICAgICAgICAgICBtYXhpbWl6ZShhbnMsIHJlcy5kaXN0UmlnaHQgKyBoaWdoW3ZdKTsKICAgICAgICB9IGVsc2UgaWYgKHRpbWVJblt3XSA8PSB0aW1lSW5bdl0gJiYgdGltZU91dFt2XSA8PSB0aW1lT3V0W3ddKSB7CiAgICAgICAgICAgIG1heGltaXplKGFucywgbWF4RGlzdCh2LCAxLCB0aW1lSW5bd10gLSAxKSk7CiAgICAgICAgICAgIG1heGltaXplKGFucywgbWF4RGlzdCh2LCB0aW1lT3V0W3ddICsgMSwgbGVuVG91cikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1heGltaXplKGFucywgbWF4RGlzdCh2LCB0aW1lSW5bdl0sIGxlblRvdXIpKTsKICAgICAgICAgICAgTm9kZSBMID0gZ2V0RGlzdCgxLCAxLCBsZW5Ub3VyLCAxLCB0aW1lSW5bd10gLSAxKTsKICAgICAgICAgICAgTm9kZSBSID0gZ2V0RGlzdCgxLCAxLCBsZW5Ub3VyLCB0aW1lT3V0W3ddICsgMSwgdGltZUluW3ZdKTsKICAgICAgICAgICAgTm9kZSByZXMgPSBjb21iaW5lKEwsIFIpOwogICAgICAgICAgICBtYXhpbWl6ZShhbnMsIHJlcy5kaXN0TGVmdCArIGhpZ2hbdl0pOwogICAgICAgIH0KCiAgICAgICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4odGFzayIuaW5wIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4odGFzayIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpbnQgdGMgPSAxOwogICAgY2luID4+IHRjOwogICAgd2hpbGUodGMtLSkgewogICAgICAgIGluaXQoKTsKICAgICAgICBwcm9jZXNzKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=