Cod sursa(job #3278566)

Utilizator Theo_PetrescuPetrescu Theodor Theo_Petrescu Data 20 februarie 2025 10:06:18
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>
#include <cmath>
#define pb push_back
using namespace std;
const int nmax=2e5 +1;
int n,k;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
vector <vector <int> > graf(nmax);
vector <int> niv(nmax);
vector <int> tata(nmax);
int lift[20][nmax];

void dfs ( int nod )
{
    int p=1;
    while(niv[nod] - (1<<p) >=0 && lift[p - 1][nod] != 0)
    {
        lift[p][nod]=lift[p-1][lift[p-1][nod]];
        p++;
    }

    for( int i=0 ; i< graf[nod].size(); i++)
    {
        int vecin = graf[nod][i];
        if(vecin != tata[nod])
        {
            niv[vecin]=niv[nod]+1;
            dfs(vecin);
        }
    }

}
int binary_lifting (int x, int y)
{
    if(niv[x]<niv[y])swap(x,y);
    int lg=log2(niv[x]+1);

    for(int i=lg; i>=0;i--)
    {
        if (niv[x]-(1 << i)>=niv[y])
            x=lift[i][x];

    }
    if(x==y)return x;
    for(int i=lg; i>=0;i--)
    {
        if (lift[i][x] && lift[i][x]!= lift[i][y]){
            x=lift[i][x];
            y=lift[i][y];
        }

    }
    return lift[0][x];
}

int main()
{
    cin>>n>>k;
    tata[1]=1;
    for(int i=2;i<=n;i++)
    {
        cin>>tata[i];
    }

    for(int i=1;i<=n;i++)
    {
        graf[i].pb(tata[i]);
        graf[tata[i]].pb(i);
        lift[0][i]=tata[i];
    }
    dfs(1);
    int x,y;
    for(int i=1;i<=k;i++)
    {
        cin>>x>>y;
        cout<<binary_lifting(x,y)<<endl;
    }
    return 0;
}