Cod sursa(job #3004402)

Utilizator pifaDumitru Andrei Denis pifa Data 16 martie 2023 12:14:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 1e5 + 5;

int n, q;

int dep[N], up[20][N];

vector <int> g[N];

void dfs(int nod, int depev, int par)
{

    dep[nod] = depev;

    for(auto it:g[nod])
    {
        if(it != par)
        dfs(it, depev + 1, nod);
    }
}

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


int main()
{
    in >> n >> q;
    for(int i = 2; i <= n; i++)
    {
        int x;
        in >> x;
        g[x].push_back(i);
        up[0][i] = x;
    }
    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] ];
        }
    }
    while(q--)
    {
        int x,y;
        in >> x >> y;
        out << depca(x, y) << '\n';
    }
    return 0;
}