Cod sursa(job #3309595)

Utilizator luca._.solosluca solos luca._.solos Data 6 septembrie 2025 20:17:12
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax=1e5+3;

int n, m, aux, timp, l;
vector <int> v[nmax];
int in[nmax], out[nmax];
int up[nmax][18];

void dfs(int u, int p)
{
    in[u]=timp++;

    up[u][0]=p;
    for(int i=1; i<=l; i++)
        up[u][i]=up[up[u][i-1]][i-1];

    for(auto i:v[u])
        dfs(i, u);

    out[u]=timp++;
}

bool stramos(int u, int v)//true, daca u este stramos lui v
{
    return in[u]<=in[v] && out[v]<=out[u];
}

int query(int u, int v)
{
    if(stramos(u, v)) return u;
    if(stramos(v, u)) return v;

    for(int i=l; i>=0; i--)
    {
        if(!stramos(up[u][i], v))
            u=up[u][i];
    }
    return up[u][0];
}

int main()
{
    fin>>n>>m;
    for(int i=2; i<=n; i++)
    {
        fin>>aux;
        v[aux].push_back(i);
    }
    l=ceil(log2(n));
    timp=1;
    for(int i=0; i<=l; i++)
        up[1][i]=0;
    dfs(1, 0);
    in[0]=0;
    out[0]=timp;

    for(int i=1; i<=m; i++)
    {
        int u, v;
        fin>>u>>v;
        fout<<query(u, v)<<'\n';
    }

    return 0;
}