Cod sursa(job #3294403)

Utilizator 1gbr1Gabara 1gbr1 Data 22 aprilie 2025 18:37:17
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
#include <stack>
#include <iostream>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
int dp[17][100005];
vector<int> L[100005];
int lvl[100005];
void dfs(int nod)
{
    for (auto it : L[nod])
        lvl[it] = lvl[nod] + 1, dfs(it);
}
int kstramos(int nod, int k)
{
    int sol = nod;
    for (int i = 0; (1 << i) <= k; i++)
        if ((1 << i) & k)
            sol = dp[i][sol];
    return sol;
}
int lca(int x, int y)
{
    int st = 0, dr = min(lvl[x], lvl[y]);
    int sol = 0;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        int val1 = kstramos(x, lvl[x] - mij);
        int val2 = kstramos(y, lvl[y] - mij);
        if (val1 == val2)
            sol = val1, st = mij + 1;
        else
            dr = mij - 1;
    }return sol;
}
int main()
{
    int n, m;
    fin >> n >> m;
    dp[0][1] = 1;
    for (int i = 2; i <= n; i++)
    {
        fin >> dp[0][i];
        L[dp[0][i]].push_back(i);
    }
    dfs(1);
    for (int i = 1; (1 << i) <= n; i++)
        for (int j = 1; j <= n; j++)
            dp[i][j] = dp[i - 1][dp[i - 1][j]];

    while (m--)
    {
        int x, y;
        fin >> x >> y;
        fout << lca(x, y) << "\n";
    }
    return 0;
}