Cod sursa(job #3310447)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 14 septembrie 2025 00:36:17
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include<bits/stdc++.h>

using namespace std;

const int NMAX = 1e5 + 5, LGMAX = 18;
int n, m, tata[NMAX], up[NMAX][LGMAX], depth[NMAX];
vector<int> v[NMAX];

void dfs(int node)
{
    for(auto u : v[node])
    {
        depth[u] = depth[node] + 1;
        up[u][0] = node;
        for(int i = 1; i < LGMAX; i++)
        {
            up[u][i] = up[up[u][i - 1]][i - 1];
        }
        dfs(u);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);

    cin >> n >> m;

    for(int i = 2; i <= n; i++)
    {
        cin >> tata[i];
        v[tata[i]].push_back(i);
    }

    dfs(1);

    for(int i = 1; i <= m; i++)
    {
        int a, b;
        cin >> a >> b;
        if(depth[a] < depth[b])
            swap(a, b);

        int k = depth[a] - depth[b];
        for(int i = LGMAX - 1; i >= 0; i--)
        {
            if(k & (1 << i))
                a = up[a][i];
        }

        if(a == b)
        {
            cout << a << "\n";
            continue;
        }

        for(int i = LGMAX - 1; i >= 0; i--)
        {
            if(up[a][i] != up[b][i])
            {
                a = up[a][i];
                b = up[b][i];
            }
        }

        cout << up[a][0] << "\n";
    }
}