Cod sursa(job #2509922)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 15 decembrie 2019 11:38:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

//varianta 4 - Stramosi

ifstream f("lca.in");
ofstream g("lca.out");

const int nmax = 100005;

int level[nmax];
int dp[nmax][17];
vector <int> son[nmax];

void dfs(int nod, int lvl)
{
    level[nod] = lvl;
    for (auto el : son[nod])
    {
        dp[el][0] = nod;
        dfs(el, lvl + 1);
    }
}

int solve(int a, int b)
{
    if (level[a] < level[b])
        swap(a, b);
    int pow;
    for (pow = 1; (1 << pow) < level[a]; ++ pow);
    while (pow >= 0)
    {
        if (level[a] - (1 << pow) >= level[b])
            a = dp[a][pow];
        -- pow;
    }
    if (a == b)
        return a;

    for (pow = 1; (1 << pow) < level[a]; ++ pow);
    while(pow >= 0)
    {
        if (dp[a][pow] != dp[b][pow])
        {
            a = dp[a][pow];
            b = dp[b][pow];
        }
        -- pow;
    }
    return dp[a][0];
}

int main()
{
    int n, m;
     f >> n >> m;
    for (int i = 1; i < n; ++ i)
    {
        int x;
        f >> x;
        son[x].push_back(i + 1);
    }
    dfs(1, 0);
    for (int nod = 1; nod <= n; ++ nod)
        for (int j = 1; (1 << j) <= level[nod]; ++ j)
            dp[nod][j] = dp[dp[nod][j - 1]][j - 1];

    for (int i = 1; i <= m; ++ i)
    {
        int a, b;
        f >> a >> b;
        g << solve(a, b) << '\n';
    }
}