1
+ /*
2
+ * Deleted code is debugged code :)
3
+ */
4
+ #include < bits/stdc++.h>
5
+ #define ll long long
6
+ #define ull unsigned long long
7
+ #define vi vector<ll>
8
+ #define pp pair<ll,ll>
9
+ #define mp make_pair
10
+ #define PI acos (-1.0 )
11
+ #define all (v ) v.begin(),v.end()
12
+ #define pb push_back
13
+ #define FOR (i,a,b ) for (i=a;i<b;i++)
14
+ #define FREV (i,a,b ) for (i=a;i>=b;i--)
15
+ #define SULL (n ) scanf(" %llu" , &n)
16
+ #define INF 1e18
17
+ #define MOD 1000000007
18
+
19
+ #ifndef ONLINE_JUDGE
20
+ #define gc getchar
21
+ #define pc putchar
22
+ #else
23
+ #define gc getchar_unlocked
24
+ #define pc putchar_unlocked
25
+ #endif
26
+
27
+ using namespace std ;
28
+
29
+ int read_int () {
30
+ char c = gc ();
31
+ while ((c < ' 0' || c > ' 9' ) && c != ' -' ) c = gc ();
32
+ int ret = 0 , neg = 0 ;
33
+ if (c == ' -' ) neg = 1 , c = gc ();
34
+ while (c >= ' 0' && c <= ' 9' ) {
35
+ ret = 10 * ret + c - 48 ;
36
+ c = gc ();
37
+ }
38
+ return neg ? -ret : ret;
39
+ }
40
+
41
+ ll read_ll () {
42
+ char c = gc ();
43
+ while ((c < ' 0' || c > ' 9' ) && c != ' -' ) c = gc ();
44
+ ll ret = 0 ;
45
+ int neg = 0 ;
46
+ if (c == ' -' ) neg = 1 , c = gc ();
47
+ while (c >= ' 0' && c <= ' 9' ) {
48
+ ret = 10 * ret + c - 48 ;
49
+ c = gc ();
50
+ }
51
+ return neg ? -ret : ret;
52
+ }
53
+
54
+ /* ******************************************RANDOM STUFF BEGINS HERE**************************************************/
55
+
56
+ struct node {
57
+ vi adj;
58
+ };
59
+
60
+ vector<node> tree;
61
+ vi depth (100005 ), parent(100005 );
62
+
63
+ // DFS to calculate depths of the nodes
64
+ void dfs (ll u) {
65
+ ll i, len = tree[u].adj .size ();
66
+ FOR (i,0 ,len) {
67
+ ll v = tree[u].adj [i];
68
+ depth[v] = depth[u] + 1 ;
69
+ dfs (v);
70
+ }
71
+ }
72
+
73
+ // Preprocessing for LCA in O(nlogn)
74
+ // binary_ancestor[i][j] stores the 2^j ancestor of node i
75
+
76
+ ll binary_ancestor[1000005 ][20 ];
77
+
78
+ void LCA_preprocessing (ll n) {
79
+ ll i, j;
80
+
81
+ for (i = 1 ; i <= n; i++) {
82
+ for (j = 0 ; 1 << j <= n; j++) {
83
+ binary_ancestor[i][j] = -1 ;
84
+ }
85
+ }
86
+
87
+ for (i = 1 ; i <= n; i++) {
88
+ binary_ancestor[i][0 ] = parent[i];
89
+ }
90
+
91
+ for (j = 1 ; 1 << j <=n; j++) {
92
+ for (i = 1 ; i <= n; i++) {
93
+ binary_ancestor[i][j] = binary_ancestor[binary_ancestor[i][j-1 ]][j-1 ];
94
+ }
95
+ }
96
+ }
97
+
98
+ ll getLCA (ll x, ll y) {
99
+ ll i, temp, log;
100
+
101
+ // make x the node with greater depth
102
+ if (depth[x] < depth[y]) {
103
+ temp = x, x = y, y = temp;
104
+ }
105
+
106
+ for (log = 1 ; 1 << log <= depth[x]; log++);
107
+ log--;
108
+
109
+ // bring x and y to the same level
110
+ for (i = log; i >= 0 ; i--) {
111
+ if (depth[x] - (1 << i) >= depth[y]) {
112
+ x = binary_ancestor[x][i];
113
+ }
114
+ }
115
+
116
+ // x and y are now at the same level
117
+ for (i = log; i >= 0 ; i--) {
118
+ if (binary_ancestor[x][i] != -1 && binary_ancestor[x][i] != binary_ancestor[y][i]) {
119
+ x = binary_ancestor[x][i];
120
+ y = binary_ancestor[y][i];
121
+ }
122
+ }
123
+
124
+ return parent[x];
125
+ }
126
+
127
+ int main () {
128
+ ll i,j,t,n,x,y;
129
+ n = read_ll ();
130
+ tree.resize (n+1 );
131
+ // 1 is the root. Accept parents of the remaining (n-1) nodes
132
+ FOR (i,2 ,n+1 ) {
133
+ j = read_ll ();
134
+ tree[j].adj .pb (i);
135
+ parent[i] = j;
136
+ }
137
+ dfs (1 );
138
+ LCA_preprocessing (n);
139
+ x = read_ll ();
140
+ y = read_ll ();
141
+ cout << " LCA of " << x << " and " << y << " = " << getLCA (x,y) << endl;
142
+ return 0 ;
143
+ }
0 commit comments