Cod sursa(job #3030029)

Utilizator MihaiCostacheCostache Mihai MihaiCostache Data 17 martie 2023 13:43:00
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q, pstart[200005], k, pfinal[200005], dp[20][200005];
vector <int> l[100001];

void dfs(int nod)
{
    pstart[nod]=++k;
    for(int i=0; i<l[nod].size(); i++)
    {
        int vecin=l[nod][i];
        dfs(vecin);
    }
    pfinal[nod]=++k;
}

bool este_stramos(int x, int y)
{
    return pstart[x]<=pstart[y] && pfinal[y]<=pfinal[x];
}

int lca(int x, int y)
{
    if(este_stramos(x, y))
        return x;
    if(este_stramos(y, x))
        return y;
    for(int p=19-1; p>=0; p--)
    {
        int z=dp[p][x];
        if(z!=0 && !este_stramos(z, y))
            x=z;
    }
    return dp[0][x];
}

int main()
{
    fin>>n>>q;
    for(int i=2; i<=n; i++)
    {
        fin>>dp[0][i];
        l[dp[0][i]].push_back(i);
    }
    dfs(1);
    for(int j=1; j<=20; j++)
    {
        for (int i=1; i<=n; i++)
        {
            dp[j][i]=dp[j-1][dp[j-1][i]];
        }
    }
    while(q--)
    {
        int x, y;
        fin>>x>>y;
        fout<<lca(x, y)<<"\n";
    }
    return 0;
}