using
System;
using
System.Collections.Generic;
public
class
GFG {
static
int
sz = 101;
static
List<
int
>[] adj =
new
List<
int
>[sz];
static
List<
int
> euler =
new
List<
int
>();
static
List<
int
> depthArr =
new
List<
int
>();
static
int
[] FAI =
new
int
[sz];
static
int
[] level =
new
int
[sz];
static
int
ptr;
static
int
[,] dp =
new
int
[sz, 18];
static
int
[] logn =
new
int
[sz];
static
int
[] p2 =
new
int
[20];
static
void
buildSparseTable(
int
n)
{
for
(
int
i = 0; i < sz; i++)
{
for
(
int
j = 0; j < 18; j++)
{
dp[i,j] = -1;
}
}
for
(
int
i = 1; i < n; i++)
dp[i - 1,0] = (depthArr[i] > depthArr[i - 1]) ? i - 1 : i;
for
(
int
l = 1; l < 15; l++)
for
(
int
i = 0; i < n; i++)
if
(dp[i,l - 1] != -1 && dp[i + p2[l - 1],l - 1] != -1)
dp[i,l] = (depthArr[dp[i,l - 1]] > depthArr[dp[i + p2[l - 1],l - 1]]) ? dp[i + p2[l - 1],l - 1] : dp[i,l - 1];
else
break
;
}
static
int
query(
int
l,
int
r)
{
int
d = r - l;
int
dx = logn[d];
if
(l == r)
return
l;
if
(depthArr[dp[l,dx]] > depthArr[dp[r - p2[dx],dx]])
return
dp[r - p2[dx],dx];
else
return
dp[l,dx];
}
static
void
preprocess()
{
p2[0] = 1;
for
(
int
i = 1; i < 18; i++)
p2[i] = p2[i - 1] * 2;
int
val = 1, ptr = 0;
for
(
int
i = 1; i < sz; i++)
{
logn[i] = ptr - 1;
if
(val == i)
{
val *= 2;
logn[i] = ptr;
ptr++;
}
}
}
static
void
dfs(
int
cur,
int
prev,
int
dep)
{
if
(FAI[cur] == -1)
FAI[cur] = ptr;
level[cur] = dep;
euler.Add(cur);
ptr++;
foreach
(
int
x
in
adj[cur])
{
if
(x != prev)
{
dfs(x, cur, dep + 1);
euler.Add(cur);
ptr++;
}
}
}
static
void
makeArr()
{
foreach
(
int
x
in
euler)
depthArr.Add(level[x]);
}
static
int
LCA(
int
u,
int
v)
{
if
(u == v)
return
u;
if
(FAI[u] > FAI[v])
{
int
temp = u;
u = v;
v = temp;
}
return
euler[query(FAI[u], FAI[v])];
}
static
void
addEdge(
int
u,
int
v)
{
adj[u].Add(v);
adj[v].Add(u);
}
static
void
Main(
string
[] args)
{
int
sz = 9;
adj =
new
List<
int
>[sz];
for
(
int
i = 0; i < sz; i++)
{
adj[i] =
new
List<
int
>();
}
int
numberOfNodes = 8;
addEdge(1, 2);
addEdge(1, 3);
addEdge(2, 4);
addEdge(2, 5);
addEdge(2, 6);
addEdge(3, 7);
addEdge(3, 8);
preprocess();
ptr = 0;
Array.Fill(FAI, -1);
dfs(1, 0, 0);
makeArr();
buildSparseTable(depthArr.Count);
Console.WriteLine(
"LCA(6,7) : "
+ LCA(6, 7));
Console.WriteLine(
"LCA(6,4) : "
+ LCA(6, 4));
}
}