Pagini recente » Borderou de evaluare (job #3364927) | Borderou de evaluare (job #3364887) | Borderou de evaluare (job #3364917) | Borderou de evaluare (job #3366438) | Cod sursa (job #3365393)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
int n, m;
int x;
int k = 18;
int str[100005][18];
vector <int> adj[100005];
int tin[100005];
int tout[100005];
int t = 0;
int a, b;
void dfs(int u)
{
tin[u] = t++;
for (int i = 1; i < k; i++)
{
if (str[u][i - 1] != -1) str[u][i] = str[str[u][i - 1]][i - 1];
else str[u][i] = -1;
}
for (const auto& x : adj[u])
{
if (x != str[u][0])
{
str[x][0] = u;
dfs(x);
}
}
tout[u] = t++;
}
bool stramos(int u, int v)
{
return tin[u] <= tin[v] && tin[v] < tout[u];
}
int lca(int u, int v)
{
if (stramos(u, v)) return u;
else if (stramos(v, u)) return v;
else
{
for (int i = k - 1; i >= 0; i--)
{
if (str[u][i] != -1 && !stramos(str[u][i], v))
{
u = str[u][i];
}
}
return str[u][0];
}
}
int main()
{
cin >> n >> m;
for (int i = 2; i <= n; i++)
{
cin >> x;
adj[x].push_back(i);
}
str[1][0] = -1;
dfs(1);
while(m--)
{
cin >> a >> b;
cout << lca(a, b) << '\n';
}
return 0;
}