Cod sursa(job #2824036)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 30 decembrie 2021 18:22:14
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int N_MAX = 1e5 + 5;
const int LOG = 20;

int n, m;
int p[N_MAX][LOG + 5], depth[N_MAX];
vector<int> adj[N_MAX];

void dfs(int node, int d = 0)
{
    depth[node] = d;
    for(auto it: adj[node])
        dfs(it, d + 1);
}

void precompute()
{
    for(int j = 1; j <= LOG; j++)
        for(int i = 1; i <= n; i++)
            p[i][j] = p[p[i][j - 1]][j - 1];

    dfs(1);
}

int lca(int a, int b)
{
    if(depth[a] < depth[b])
        swap(a, b);

    int k = depth[a] - depth[b];
    for(int j = LOG; j >= 0; j--)
        if(k & (1 << j))
            a = p[a][j];

    if(a == b)
        return a;

    for(int j = LOG; j >= 0; j--)
    {
        if(p[a][j] != p[b][j])
        {
            a = p[a][j];
            b = p[b][j];
        }
    }

    return p[a][0];
}

int main()
{
    in >> n >> m;
    p[1][0] = 1;
    for(int i = 2; i <= n; i++)
    {
        in >> p[i][0];
        adj[p[i][0]].push_back(i);
    }

    precompute();

    while(m--)
    {
        int x, y;
        in >> x >> y;
        out << lca(x, y) << '\n';
    }

    return 0;
}