Cod sursa(job #2989155)

Utilizator pifaDumitru Andrei Denis pifa Data 6 martie 2023 01:04:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
//#define int long long
/// lca cu binary jumping
using namespace std;

int n;

const int N = 1e5 + 5;

int father[N];

vector <int> g[N];

int up[21][N];

int q;

int L[N];

void dfs(int nod, int level, int p)
{
    L[nod] = level;
    for(int v:g[nod])
    {
        if(v != p)
            dfs(v, level + 1, nod);
    }
}

int lca(int p, int q)
{
    if(L[p] < L[q])
        swap(p, q);
    int diff = L[p] - L[q];
    for(int i = 20; i >= 0; i--)
        if(diff & (1 << i)) p = up[i][p];
    if(p == q) return p;
    for(int i = 20; i >= 0; i--)
    {
        if(up[i][p] != up[i][q])
        {
            p = up[i][p];
            q = up[i][q];
        }
    }
    return up[0][p];
}

signed main()
{
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int  m;
    cin >> n >> m;
    for (int i = 2; i <= n; ++i)
    {
        cin >> father[i];
        g[father[i]].push_back(i);
        up[0][i] = father[i];
    }
    up[0][1] = 0;
    dfs(1, 0, -1);
    for(int i = 1; 1 << i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            up[i][j] = up[i - 1][ up[i - 1][j] ];
        }
    }
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        cout << lca(x, y) << '\n';
    }
    return 0;
}