Untitled

public
6shootingstar9 May 06, 2025 Never 28
Clone
Plaintext paste1.txt 88 lines (88 loc) | 1.45 KB
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
}