Cod sursa(job #3309593)

Utilizator luca._.solosluca solos luca._.solos Data 6 septembrie 2025 20:09:30
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 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
{
    if(out[u]==0) out[u]=nmax, in[u]=0;
    if(out[v]==0) out[v]=nmax, in[v]=0;
    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;
    dfs(1, 0);

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

    return 0;
}