#include <cstdio>
using namespace std;
const int N = 1000005;
struct Edge {
int v, next;
} edge[2 * N];
int head[N];
int cnt;
void add_edge(int u, int v) {
cnt++;
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt;
}
int fa[N], dep[N], size[N], son[N];
void dfs1(int u, int fa) {
::fa[u] = fa;
dep[u] = dep[fa] + 1;
size[u] = 1;
for (int v, i = head[u]; i != 0; i = edge[i].next) {
v = edge[i].v;
if (v != fa) {
dfs1(v, u);
size[u] += size[v];
if (size[son[u]] < size[v]) {
son[u] = v;
}
}
}
}
int top[N], dfn[N], timer, seq[N];
void dfs2(int u, int toplink) {
top[u] = toplink;
timer++;
dfn[u] = timer;
seq[timer] = u;
if (son[u] != 0) {
dfs2(son[u], toplink);
for (int v, i = head[u]; i != 0; i = edge[i].next) {
v = edge[i].v;
if (v != fa[u] && v != son[u]) {
dfs2(v, v);
}
}
}
}
int LCA(int u, int v) {
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]]) {
u ^= v ^= u ^= v;
}
u = fa[top[u]];
}
return dep[u] < dep[v] ? u : v;
}
int ancestor(int u, int k) {
while (true) {
if (k <= dep[u] - dep[top[u]]) {
break;
}
k -= dep[u] - dep[fa[top[u]]];
u = fa[top[u]];
}
return seq[dfn[u] - k];
}
int main() {
int n, u, q;
scanf("%d %d %d", &n, &u, &q);
for (int u, v, i = 1; i < n; i++) {
scanf("%d %d", &u, &v);
add_edge(u, v);
add_edge(u, v);
}
dfs1(1, 0);
dfs2(1, 1);
for (int v, p, t, d1, d2; q != 0; q--) {
scanf("%d %d", &v, &t);
p = LCA(u, v);
d1 = dep[u] - dep[p];
d2 = dep[v] - dep[p];
if (t >= d1 + d2) {
u = v;
} else if (t >= d1) {
u = ancestor(v, d1 + d2 - t);
} else {
u = ancestor(u, t);
}
printf("%d ", u);
}
return 0;
}