Cod sursa(job #3130433)

Utilizator otilia_nedelcu@yahoo.comGutanu Tiberiu [email protected] Data 17 mai 2023 19:43:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m;
const int N=1e5+5;
vector<int>a[N];
int niv[N],up[21][N];
void dfs(int nod,int tt)
{
    niv[nod]=niv[tt]+1;
    for(int i=1;i<=20;i++)
    {
        up[i][nod]=up[i-1][up[i-1][nod]];
        if(!up[i][nod])
            break;
    }
    for(auto x : a[nod])
    {
        up[0][x]=nod;
        dfs(x,nod);

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

int main()
{
    f>>n>>m;
    for(int i=2;i<=n;i++)
    {
        int x;
        f>>x;
        a[x].push_back(i);
    }
    dfs(1,0);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        f>>x>>y;
        g<<calc(x,y)<<'\n';
    }
    return 0;
}