Cod sursa(job #2922338)

Utilizator Theo14Ancuta Theodor Theo14 Data 7 septembrie 2022 22:42:04
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include<bits/stdc++.h>
#define int long long
using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

int n,m,t[100005],nivel[100005],w[23][100005];
vector<int>v[100005];

void dfs(int x)
{
    nivel[1]=0;
    for(auto it:v[x])
    {
        nivel[it]=nivel[x]+1;
        dfs(it);
    }
}

signed main()
{
    int i,x,y,j,bit,nr,nr1;
    f>>n>>m;
    for(i=2; i<=n; i++)
    {
        f>>t[i];
        v[t[i]].push_back(i);
        w[0][i]=t[i];
    }
    dfs(1);
    for(i=1; i<=20; i++)
    {
        for(j=1; j<=n; j++)
            w[i][j]=w[i-1][w[i-1][j]];//aici precalc
    }
    for(i=1; i<=m; i++)
    {
        f>>x>>y; //aduc la acelasi nivel
        if(nivel[x]>nivel[y])
        {
            swap(x,y);
        }
        int dif=nivel[y]-nivel[x];
        for(bit=19; bit>=0; bit--)
        {
            if((1<<bit)<=dif)
            {
                dif-=(1<<bit);
                y=w[bit][y];
            }
        }
        if(x==y)
            g<<x<<'\n';//daca sunt deja pe lca
        else//daca nu caut
        {
            for(bit=19; bit>=0; bit--)
            {
                if(w[bit][x] && w[bit][x]!=w[bit][y])
                {
                    x=w[bit][x];
                    y=w[bit][y];
                }
            }
            g<<w[0][x]<<'\n';
        }
    }
    return 0;
}