// tarjan 求 LCA O(n + m) 离线算法
#include <bits/stdc++.h>
using namespace std ;
const int N = 1e5 + 10 ;
pair<int , int> q_e[N << 1] , Q[N] ;
int e[N << 1] , ne[N << 1] , h[N << 1] , idx ;
int q_ne[N << 1] , q_h[N << 1] , q , cnt ;
inline void add(int a,int b) {
e[idx] = b , ne[idx] = h[a] , h[a] = idx++ ;
}
inline void add_q(int a,int b,int num) {
q_e[cnt] = {b , num} , q_ne[cnt] = q_h[a] , q_h[a] = cnt++ ;
}
int f[N] , n , root ;
inline int find_set(int x) {
return f[x] == x ? x : f[x] = find_set(f[x]) ;
}
int vis[N] , ans[N] ;
inline void tarjan(int v)
{
vis[v] = 1 ;
for(int i = h[v] ; ~i ; i = ne[i])
{
int u = e[i] ;
if ( !vis[u] )
{
tarjan(u) ;
f[u] = v ;
}
}
for(int i = q_h[v] ; ~i ; i = q_ne[i])
{
int u = q_e[i].first , j = q_e[i].second ;
if ( vis[u] )
{
ans[j] = find_set(u) ;
}
}
}
int main()
{
cin.tie(nullptr)->ios::sync_with_stdio(false) ;
cin >> n ;
memset(h , -1 , sizeof h) ;
memset(q_h , -1 , sizeof q_h) ;
for(int i = 1 ; i < N ; ++ i) f[i] = i ;
for(int i = 1 ; i <= n ; ++ i)
{
int u , v ;
cin >> u >> v ;
if ( !(~v) ) {
root = u ;
} else {
add(u , v) , add(v , u) ;
}
}
cin >> q;
for(int i = 1 ; i <= q ; ++ i)
{
int x , y ;
cin >> x >> y ;
Q[i] = {x , y} ;
add_q(x , y , i) , add_q(y , x , i) ;
}
tarjan(root) ;
for(int i = 1 ; i <= q ; ++ i)
{
if ( ans[i] == Q[i].first ) {
cout << 1 << '\n' ;
} else if ( ans[i] == Q[i].second ) {
cout << 2 << '\n' ;
} else {
cout << 0 << '\n' ;
}
}
return 0 ;
}