Cod sursa(job #2914351)

Utilizator AswVwsACamburu Luca AswVwsA Data 19 iulie 2022 17:37:52
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;

const int LOG = 17;
vector <int> g[200003];
bool viz[200003];
int dp[19][200003], d[200003];

void dfs(int nod)
{
    for (int u : g[nod])
        if (!viz[u])
        {
            d[u] = d[nod] + 1;
            dfs(u);
        }
}
int main()
{
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    int n, q, i;
    cin >> n >> q;
    for (i = 2; i <= n; i++)
    {
        int x;
        cin >> x;
        dp[0][i] = x;
        g[x].push_back(i);
    }
    dfs(1);
    for (int j = 1; (1 << j) <= n; j++)
        for (int i = 1; i <= n; i++)
            dp[j][i] = dp[j - 1][dp[j - 1][i]];
    while (q--)
    {
        int a, b;
        cin >> a >> b;
        if (d[a] < d[b])
            swap(a, b);
        int k = d[a] - d[b];
        for (int j = 0; (1 << j) <= k; j++)
            if (k & (1 << j))
                a = dp[j][a];
        if (a == b)
        {
            cout << a << "\n";
            continue;
        }
        for (int j = LOG; j >= 0; j--)
            if (dp[j][a] != dp[j][b])
            {
                a = dp[j][a];
                b = dp[j][b];
            }
        cout << dp[0][a] << "\n";
    }
}