Cod sursa(job #3365393)

Utilizator JenJenCristache Ion JenJen Data 20 septembrie 2026 17:59:15
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#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;
}