Cod sursa(job #3349173)

Utilizator Ionut2212Nedelcu Alexandru Ionut Ionut2212 Data 25 martie 2026 20:01:13
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int> > v;
const int log = 17;
int anc[20][100001], niv[100001];
void dfs(int nod, int tata)
{
    //cout << nod;
    anc[0][nod] = tata;
    for(int i = 1; i<log; i++)
    {
        anc[i][nod] = anc[i-1][anc[i-1][nod]];
    }
    for(int i = 0; i<v[nod].size(); i++)
    {
        if(tata != v[nod][i])
        {
            niv[v[nod][i]] = niv[nod] + 1;
            dfs(v[nod][i],nod);
        }
    }
}
int lca(int nod1, int nod2)
{
    if(niv[nod1] < niv[nod2]) swap(nod1, nod2);
    for(int i = 0; i<=log; i++)
    {
        if(niv[nod1] - (1 << i) >= niv[nod2])
            nod1 = anc[i][nod1];
    }
    if(nod1 == nod2) return nod1;
    for(int i = 0; i<=log; i++)
    {
        if(anc[i][nod1] != anc[i][nod2])
        {
            nod1 = anc[i][nod1];
            nod2 = anc[i][nod2];
        }
    }
    return anc[0][nod1];
}
int main()
{
    int n, m;
    fin >> n >> m;
    v.resize(n+1);
    for(int i = 2; i<=n; i++)
    {
        int x;
        fin >> x;
        v[x].push_back(i);
    }
    niv[1] = 1;
    dfs(1,0);
    for(int i = 1; i<=m; i++)
    {
        int a, b;
        fin >> a >> b;
        fout << lca(a,b) << '\n';
    }
    return 0;
}