Cod sursa(job #3216589)

Utilizator solicasolica solica solica Data 18 martie 2024 11:49:58
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin ("lca.in");
ofstream fout ("lca.out");

#define NMAX 100008
#define LOGMAX 20

int depth[NMAX],parent[LOGMAX][NMAX],n,m,a,b,i,j;

vector<int>muchii[NMAX];

void dfs (int ad, int node);

void gensparse(int n);

int lca (int x, int y);

int main()
{
    fin>>n>>m;
    parent[0][1]=1;
    for(i=2; i<=n; i++)
    {
        fin>>a;
        muchii[a].push_back(i);
        parent[0][i]=a;
    }
    dfs(1,1);
    gensparse(n);
    for (i=1; i<=m; i++)
    {
        fin>>a>>b;
        fout<<lca(a,b)<<'\n';
    }
    return 0;
}

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

void gensparse (int n)
{
    for (int lg=1; lg<LOGMAX; lg++)
    {
        for (i=1; i<=n; i++)
        {
            if (parent[lg-1][i])
            {
                parent[lg][i]=parent[lg-1][parent[lg-1][i]];
            }
        }
    }
}

void dfs (int ad, int node)
{
    depth[node]=ad;
    for (auto vec : muchii[node])
    {
        dfs(ad+1,vec);
    }
}