Cod sursa(job #3206825)

Utilizator raresOObreja Rares raresO Data 24 februarie 2024 11:19:08
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

#define nmax 100010
#define log 18

int n, m, t;
int pin[nmax], pout[nmax], dp[log][nmax];
vector<int> v[nmax];

void dfs(int nod, int tata)
{
    pin[nod] = ++t;
    dp[0][nod] = tata;
    for (int i = 1; i < log; ++i)
    {
        dp[i][nod] = dp[i - 1][dp[i - 1][nod]];
    }
    int lg = v[nod].size();
    for (int i = 0; i < lg; ++i)
    {
        if (v[nod][i] != tata)
            dfs(v[nod][i], nod);
    }
    pout[nod] = ++t;
}

bool isAnc(int a, int b)
{
    // g << a << ' ' << b << '\n';
    return pin[a] < pin[b] && pout[a] > pout[b];
    return 0;
}

int lca(int a, int b)
{
    if (isAnc(a, b))
        return a;
    if (isAnc(b, a))
        return b;

    for (int i = log - 1; i >= 0; --i)
    {
        if (!isAnc(dp[i][a], b))
        {
            a = dp[i][a];
        }
    }
    return dp[0][a];
}

int main()
{
    f >> n >> m;
    for (int i = 1; i < n; ++i)
    {
        int x;
        f >> x;
        v[x].push_back(i + 1);
    }
    dfs(1, 1);
    // for (int j = 0; j <= 3; ++j)
    // {
    //     for (int i = 1; i <= n; ++i)
    //     {
    //         g << dp[j][i] << ' ';
    //     }
    //     g << '\n';
    // }

    int x, y;
    for (int i = 1; i <= m; ++i)
    {
        f >> x >> y;
        g << lca(x, y) << '\n';
    }
    return 0;
}