Cod sursa(job #2950990)

Utilizator bostanlucastefanBostan Luca-Stefan bostanlucastefan Data 5 decembrie 2022 09:06:55
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#define pb push_back

using namespace std;
using vi=vector<int>;

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

const int N=1e5+2;
const int L=18;

int niv[N],up[N][L];
int n,m,x,y,i;
vi adj[N];

void dfs(int nod,int tata){
    for(int i=1; i<=L; i++)
        up[nod][i]=up[up[nod][i-1]][i-1];
    for(auto i:adj[nod])
        if(i!=tata)
        {
            niv[i]=niv[nod]+1;
            up[i][0]=nod;
            dfs(i,nod);
        }
}

int lca(int x,int y){
    if(niv[x]<niv[y])
        swap(x,y);
    for(int i=L; i>=0; i--)
        if(up[x][i] && niv[up[x][i]]>=niv[y])
            x=up[x][i];
    if(x==y)
        return x;
    for(int i=L; i>=0; i--)
        if(up[x][i] && up[y][i] && up[x][i]!=up[y][i])
        {
            x=up[x][i];
            y=up[y][i];
        }
    return up[x][0];
}

int main()
{
    fin>>n>>m;
    for(i=2; i<=n; i++)
    {
        fin>>x;
        adj[x].pb(i);
        adj[i].pb(x);
    }
    dfs(1,0);
    for(i=1; i<=m; i++)
    {
        fin>>x>>y;
        fout<<lca(x,y)<<'\n';
    }
}