int i, n, m, s, son, fa, f[500001][18]; structnode { int h, cnt, next[2]; }; node tree[500001]; voiddfs(){ int i, j; stack<int> stk; tree[s].h = 1; stk.push(s); while (!stk.empty()) { i = stk.top(); stk.pop(); for (j = tree[i].cnt - 1; j >= 0; --j) { stk.push(tree[i].next[j]); f[tree[i].next[j]][0] = i; tree[tree[i].next[j]].h = tree[i].h + 1; } j = son = 1; while (son < tree[i].h) { f[i][j] = f[f[i][j - 1]][j - 1]; ++j; son <<= 1; } } } intjmp(int u, int h){ int i = 0; while (h) { if (h & 1) { u = f[u][i]; } ++i; h >>= 1; } return u; } intlca(int u, int v){ if (tree[u].h < tree[v].h) { swap(u, v); } u = jmp(u, tree[u].h - tree[v].h); int left = 0, right = tree[u].h, mid; while (left < right) { mid = (left + right) >> 1; if (jmp(u, mid) == jmp(v, mid)) { right = mid - 1; } else { left = mid + 1; } } right = jmp(u, left); left = jmp(v, left); return left == right ? left : f[left][0]; } intmain(){ cin >> n >> m >> s; queue<int> ans; for (i = 1; i < n; ++i) { cin >> son >> fa; tree[fa].next[tree[fa].cnt++] = son; } dfs(); for (i = 0; i < m; ++i) { cin >> son >> fa; ans.push(lca(son, fa)); } while (!ans.empty()) { cout << ans.front() << endl; ans.pop(); } }