Cod sursa(job #3226769)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 22 aprilie 2024 19:20:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
const int NMAX=100005;
const int LGMAX=18;

using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");

void dfs(int);
bool is_ancestor(int, int);
int lca(int, int);

int dp[20][NMAX], in[NMAX], out[NMAX];
vector <int> v[NMAX];
int n, q, cnt;

int main()
{
    int i, j, a, b;
    cin>>n>>q;
    for(i=2; i<=n; i++)
    {
        cin>>a;
        v[a].push_back(i);
        dp[0][i]=a;
    }
    dfs(1);
    for(j=1; j<=LGMAX; j++)
    {
        for(i=1; i<=n; i++)
            dp[j][i]=dp[j-1][dp[j-1][i]];
    }
    while(q--)
    {
        cin>>a>>b;
        cout<<lca(a, b)<<'\n';
    }
    return 0;
}

int lca(int a, int b)
{
    int j;
    if(is_ancestor(a, b)) return a;
    if(is_ancestor(b, a)) return b;
    for(j=LGMAX; j>=0; j--)
    {
        if(dp[j][a] && !is_ancestor(dp[j][a], b))
            a=dp[j][a];
    }
    return dp[0][a];
}

bool is_ancestor(int a, int b)
{
    return (in[a]<=in[b] && out[a]>=out[b]);
}

void dfs(int nod)
{
    in[nod]=++cnt;
    for(auto i:v[nod]) dfs(i);
    out[nod]=++cnt;
}