Cod sursa(job #3292228)

Utilizator alex_0747Gheorghica Alexandru alex_0747 Data 7 aprilie 2025 16:50:38
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

vector <int> L[100005];
int up[19][100005], tin[100005], tout[100005], t, n;

void DFS(int k, int ant = 0)
{
    tin[k] = ++t;
    for (int i = 1; i <= 18; i++)
        up[i][k] = up[i - 1][up[i - 1][k]];
    for (int i : L[k])
        if (i != ant)
            DFS(i, k);
    tout[k] = ++t;
}

bool isAncestor(int i, int j)
{
    if (i == 0) return true;
    return tin[i] <= tin[j] && tout[i] >= tout[j];
}

int LCA(int u, int v)
{
    if (isAncestor(u, v))
        return u;
    if (isAncestor(v, u))
        return v;
    for (int i = 18; i >= 0; i--)
        if (!isAncestor(up[i][u], v))
            u = up[i][u];
    return up[0][u];
}

int main()
{
    int i, j, k, q;
    fin >> n >> q;
    for (i = 2; i <= n; i++)
    {
        fin >> up[0][i];
        L[up[0][i]].push_back(i);
    }

    DFS(1);
    while (q--)
    {
        fin >> i >> j;
        fout << LCA(i, j) << "\n";
    }
    return 0;
}