Cod sursa(job #3244024)

Utilizator BogdanBurescuBogdan Burescu BogdanBurescu Data 23 septembrie 2024 00:06:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

ifstream cin ("lca.in");
ofstream cout ("lca.out");

int t,n,m,i,k,j,nivel[100005],parent[100005][18],x,y,ok,d,q,l,r,mij,sum,nr,maxnr,minnr,maxp,minp;
vector<int>g[100005];

void dfs(int nod, int niv)
{
    nivel[nod]=nivel[niv]+1;
    parent[nod][0]=niv;
    for(i=1;i<=17; i++)
        parent[nod][i]=parent[parent[nod][i-1]][i-1];
    for(auto it:g[nod])
    {
        if(it!=niv)
            dfs(it, nod);
    }
}

int lca(int x, int y)
{
    if(nivel[x]<nivel[y])
        swap(x,y);
    for(int i=17;i>=0;i--)
    {
        if(nivel[x]-(1<<i)>=nivel[y])
            x=parent[x][i];
    }
    if(x==y)
        return x;
    for(int i=17;i>=0;i--)
    {
        if(parent[x][i]!=parent[y][i])
        {
            x=parent[x][i];
            y=parent[y][i];
        }
    }
    return parent[x][0];
}

int main()
{
    cin>>n>>m;
    for(i=2; i<=n; i++)
    {
        cin>>x;
        g[x].push_back(i);
        g[i].push_back(x);
    }
    dfs(1, 0);
    for(i=1; i<=m; i++)
    {
        cin>>x>>y;
        cout<<lca(x,y)<<endl;
    }
    return 0;
}