Cod sursa(job #2674179)

Utilizator Iulia14iulia slanina Iulia14 Data 18 noiembrie 2020 18:50:42
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
vector <int> lista[100005];
int dp[21][100005];
int lvl[100005];
void dfs(int nod, int daddy)
{
    lvl[nod] = lvl[daddy] + 1;
    for (int i = 0; i < lista[nod].size(); i++)
    {
        int x = lista[nod][i];
        dfs(x, nod);
    }
}
int lca(int x, int y)
{
    int lg = 20;
    while (lvl[x] < lvl[y])
    {
        if (lvl[x] <= lvl[dp[lg][y]])
            y = dp[lg][y];
        lg--;
    }
    lg = 20;
    while (lvl[x] > lvl[y])
    {
        if (lvl[y] <= lvl[dp[lg][x]])
            x = dp[lg][x];
        lg--;
    }
    lg = 20;
    while (x != y && lg > -1)
    {
        if(dp[lg][x] != dp[lg][y])
        {
            x = dp[lg][x];
            y = dp[lg][y];
        }
        lg--;
    }
    if (x != y)
        return dp[0][x];
    return x;
}

int main()
{
    int i, j, n, m;
    cin >> n >> m;
    for (i = 2; i <= n; i++)
    {
        int daddy;
        cin >> daddy;
        dp[0][i] = daddy;
        lista[daddy].push_back(i);
    }
    dfs(1, 0);
    for (i = 1; i <= 20; i++)
        for (j = 1; j <= n; j++)
            dp[i][j] = dp[i - 1][dp[i - 1][j]];
    for (i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        cout << lca(x, y) << '\n';
    }
    return 0;
}