1 | #include<bits/stdc++.h> |
2 | using namespace std; |
3 | const int N=4*1e4+10; |
4 | int n,m; |
5 | int fa[N][31-__builtin_clz(N)+10]; |
6 | vector<int>mp[N]; |
7 | int dep[N]; |
8 | void dfs(int x,int f) |
9 | { |
10 | int lgn=31-__builtin_clz(n); |
11 | fa[x][0]=f; |
12 | for(int j=1;j<=lgn;++j) |
13 | { |
14 | fa[x][j]=fa[fa[x][j-1]][j-1]; |
15 | } |
16 | for(int v:mp[x]) |
17 | { |
18 | dfs(v,x); |
19 | } |
20 | } |
21 | int query(int x,int y) |
22 | { |
23 | int lgn=31-__builtin_clz(n); |
24 | if(dep[x]>dep[y]) |
25 | { |
26 | swap(x,y); |
27 | } |
28 | for(int i=lgn;i>=0;--i) |
29 | { |
30 | if((1<<i)&(dep[y]-dep[x])) |
31 | { |
32 | y=fa[y][i]; |
33 | } |
34 | } |
35 | if(x==y) |
36 | { |
37 | return x; |
38 | } |
39 | for(int i=lgn;i>=0;--i) |
40 | { |
41 | if(fa[x][i]!=fa[y][i]) |
42 | { |
43 | x=fa[x][i]; |
44 | y=fa[y][i]; |
45 | } |
46 | } |
47 | return fa[x][0]; |
48 | } |
49 | int main() |
50 | { |
51 | cin>>n; |
52 | for(int i=1;i<=n;i++) |
53 | { |
54 | int x,y; |
55 | cin>>x>>y; |
56 | if(y==-1) |
57 | { |
58 | dep[x]=1; |
59 | } |
60 | else |
61 | { |
62 | dep[x]=dep[y]+1; |
63 | } |
64 | mp[y].push_back(x); |
65 | } |
66 | cin>>m; |
67 | dfs(mp[-1][0],-1); |
68 | for(int i=1;i<=m;i++) |
69 | { |
70 | int x,y; |
71 | cin>>x>>y; |
72 | int f=query(x,y); |
73 | // cout<<f<<' '; |
74 | if(f==x) |
75 | { |
76 | cout<<1<<endl; |
77 | } |
78 | else if(f==y) |
79 | { |
80 | cout<<2<<endl; |
81 | } |
82 | else |
83 | { |
84 | cout<<0<<endl; |
85 | } |
86 | } |
87 | return 0; |
88 | } |