Cod sursa(job #3120931)

Utilizator AlexCroitoriuAlex Croitoriu AlexCroitoriu Data 9 aprilie 2023 14:11:47
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;
fstream f("lca.in", ios::in), g("lca.out", ios::out);
int tin[100001], tout[100001], t[100001][18], curt;
vector<int> adj[100001];
void dfs(int x)
{
    tin[x] = ++curt;
    for (auto y : adj[x])
        dfs(y);
    tout[x] = ++curt;
}
bool is_ancestor(int x, int y)
{
    return (tin[x] <= tin[y] && tout[y] <= tout[x]);
}
int lca(int x, int y)
{
    if (is_ancestor(x, y))
        return x;
    if (is_ancestor(y, x))
        return y;
    for (int i = 17; i >= 0; i--)
        if (!is_ancestor(t[x][i], y))
            x = t[x][i];
    return t[x][0];
}
int main()
{
    int n, m;
    f >> n >> m;
    for (int i = 2; i <= n; i++)
        f >> t[i][0], adj[t[i][0]].push_back(i);
    for (int j = 1; j <= 17; j++)
        for (int i = 1; i <= n; i++)
            t[i][j] = max(t[t[i][j - 1]][j - 1], 1);
    dfs(1);
    cout << is_ancestor(6, 5) << '\n';
    while (m--)
    {
        int x, y;
        f >> x >> y;
        g << lca(x, y) << '\n';
    }
}