Cod sursa(job #3261994)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 8 decembrie 2024 10:15:26
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int Lmax = 20;
vector<vector<int>> anc, graf;
vector<int> viz, d;
int n, m, x, y;
void dfs(int node, int h)
{
    viz[node] = 1;
    d[node] = h;
    for(auto next:graf[node])
        if(!viz[next])
            dfs(next, h + 1);

}
void binarylinfting()
{
    for(int l=1; l<Lmax; l++)
        for(int node = 1; node <= n; node++)
            anc[l][node] = anc[l-1][anc[l-1][node]];
}
int findanc(int node, int nanc)
{
    for(int p=0; p<Lmax; p++)
        if(nanc & (1 << p))
            node = anc[p][node];
    return node;
}
int lca(int node1, int node2)
{
    if(d[node1] < d[node2])
        swap(node1, node2);
    node1 = findanc(node1, d[node1] - d[node2]);
    if(node1 == node2)
        return node2;
    for(int p = Lmax - 1; p>=0; p--)
        if(anc[p][node1] != anc[p][node2])
        {
            node2 = anc[p][node2];
            node1 = anc[p][node1];
        }
    return anc[0][node1];
}
int main()
{
    cin >> n >> m;
    viz.resize(n+1);
    d.resize(n+1);
    anc.assign(Lmax, vector<int>(n+1, 0));
    graf.assign(n+1, vector<int>());
    for(int i=2; i<=n; i++)
    {
        cin >> anc[0][i];
        graf[anc[0][i]].push_back(i);
        graf[i].push_back(anc[0][i]);
    }
    while(m--)
    {
        cin >> x >> y;
        cout << lca(x, y) << '\n';
    }
    return 0;
}