Cod sursa(job #2914914)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 21 iulie 2022 12:45:21
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#import<fstream>
#import<vector>
#import<string>
#import<set>
#import<map>
#import<algorithm>
#import<deque>
#import<stack>
#import<cmath>
#include <ctype.h>
using namespace std;
//#define int long long
vector<vector<int>>g;
int dp[100001][18];
vector<int>niv,t;
void dfs1(int nod,int tata)
{
    t[nod]=tata;
    niv[nod]=niv[tata]+1;
    for(auto &c:g[nod])
    {
        dfs1(c,nod);
    }
}
main()
{
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    int n,q;
    cin>>n>>q;
    g.resize(n+1);
    t.resize(n+1);
    niv.resize(n+1);
    for(int i=2;i<=n;i++)
    {
        int x;
        cin>>x;
        g[x].push_back(i);
    }
    niv[1]=-1;
    dfs1(1,1);
    int niv_max=*max_element(niv.begin()+1,niv.end());
    for(int i=2;i<=n;i++)
    {
        dp[i][0]=t[i];
    }
    for(int j=1;(1<<j)<=niv_max;j++)
    {
        for(int i=1;i<=n;i++)
        {
            if(niv[i]-(1<<j)>=0)
            {
                dp[i][j]=dp[dp[i][j-1]][j-1];
            }
        }
    }
    while(q--)
    {
        int x,y;
        cin>>x>>y;
        if(niv[x]>niv[y])
        {
            swap(x,y);
        }
        for(int j=20;j>=0;j--)
        {
            if(niv[y]-(1<<j)>=niv[x])
            {
                y=dp[y][j];
            }
        }
        if(x==y)
        {
            cout<<y<<'\n';
            continue;
        }
        for(int j=20;j>=0;j--)
        {
            if(niv[y]-(1<<j)>=0 && dp[y][j]!=dp[x][j])
            {
                y=dp[y][j];
                x=dp[x][j];
            }
        }
        cout<<t[y]<<'\n';
    }
    return 0;
}