Cod sursa(job #2739980)

Utilizator Uriesu_IuliusUriesu Iulius Uriesu_Iulius Data 10 aprilie 2021 20:37:15
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int n, m, lgn;
vector<int> G[100001];
int anc[100001][17], dep[100001];

void dfs(int k, int d)
{
    dep[k]=d;
    for(int x : G[k])
        if(dep[x]==0)
            dfs(x, d+1);
}

int LCA(int x, int y)
{
    if(dep[x]<dep[y])
        swap(x, y);
    int k=dep[x]-dep[y];
    for(int j=lgn; j>=0; j--)
        if(k&(1<<j))
            x=anc[x][j];
    if(x==y)
        return x;
    for(int j=lgn; j>=0; j--)
        if(anc[x][j]!=anc[y][j])
        {
            x=anc[x][j];
            y=anc[y][j];
        }
    return anc[x][0];
}

int main()
{
    int i, j;
    fin >> n >> m;
    for(i=2; i<=n; i++)
    {
        fin >> anc[i][0];
        G[i].push_back(anc[i][0]);
        G[anc[i][0]].push_back(i);
    }
    lgn=log2(n);
    for(j=1; j<=lgn; j++)
        for(i=1; i<=n; i++)
            anc[i][j]=anc[anc[i][j-1]][j-1];
    dfs(1, 1);
    for(int k=0; k<m; k++)
    {
        fin >> i >> j;
        fout << LCA(i, j) << '\n';
    }
    return 0;
}