Cod sursa(job #3206846)

Utilizator BreabanDanielBreaban Daniel-Vasile BreabanDaniel Data 24 februarie 2024 11:46:40
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
 #include <fstream>
#include <vector>
#define NMAX 100009
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int dp[30][NMAX],contor;
vector <int> g[NMAX];
int in[NMAX],out[NMAX];
int t,n,m,aux;
bool ancestor(int x,int y);
int lca(int p,int q);
void dfs(int x);
int main()
{
    fin>>n>>m;
    dp[0][1]=1;
    for(int i=2;i<=n;i++)
    {
        fin>>t;
        g[t].push_back(i);
        dp[0][i]=t;
    }
    dfs(1);
    for(int i=1;i<=m;i++)
    {
        int p,q;
        fin>>p>>q;
        fout<<lca(p,q)<<'\n';

    }//fout<<dp[15][3];
    return 0;
}
void dfs(int x)
{
    for(int i=1;i<=20;i++)
        dp[i][x]=dp[i-1][dp[i-1][x]];
    in[x]=++contor;
    for(int i=0;i<g[x].size();i++)
        dfs(g[x][i]);
    out[x]=++contor;
}
bool ancestor(int x,int y)
{
    return in[x]<=in[y] && out[x]>=out[y];
}

int lca(int p,int q)
{
        if(ancestor(p,q))
            return p;
        if(ancestor(q,p))
            return q;
        for(int j=20;j>=0;j--)
        {
            if(!ancestor(dp[j][p],q))
                p=dp[j][p];
        }
        return dp[0][p];
}