Cod sursa(job #3168756)

Utilizator matei0000Neacsu Matei matei0000 Data 13 noiembrie 2023 11:13:18
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>

using namespace std;
int n, q;
int lift[20][100005];
int depth[100005];
vector<int> fii[100005];

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

void dfs(int nod)
{
    depth[nod] = depth[lift[0][nod]] + 1;
    for(auto i : fii[nod])
        dfs(i);
}

void build_lift()
{
    for(int bit = 1; bit < 20; bit ++)
        for(int j = 1; j <= n; j ++)
            lift[bit][j] = lift[bit - 1][lift[bit - 1][j]];
}

int lca(int u, int v)
{
    if(depth[u] > depth[v])
        swap(u, v);
    int bit = 19;
    while(bit >= 0)
    {
        if(depth[v] - (1 << bit) >= depth[u])
            v = lift[bit][v];
        bit --;
    }
    if(u == v)
        return v;
    bit = 19;
    while(bit >= 0)
    {
        if(lift[bit][u] != lift[bit][v])
            v = lift[bit][v], u = lift[bit][u];
        bit --;
    }
    return lift[0][v];
}

int main()
{
    cin >> n >> q;
    for(int i = 2; i <= n; i ++)
        cin >> lift[0][i], fii[lift[0][i]].push_back(i);
    build_lift();
    dfs(1);
    while(q --)
    {
        int u, v;
        cin >> u >> v;
        cout << lca(u, v) << '\n';
    }
}