Cod sursa(job #2397891)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 4 aprilie 2019 20:57:37
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

int n, k;
int t[100010];
int h[100010];
int bk[100010];
vector<int> tb;
vector<int> g[100010];

void dfs(int nod, int hc, int bc)
{
    if(hc % k == 0)
    {
        bc = tb.size();
        tb.push_back(t[nod]);
    }
    bk[nod] = tb[bc];
    h[nod] = hc;
    for(int m : g[nod])
        dfs(m, hc + 1, bc);
}

int main()
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    int m;
    cin >> n >> m;
    for(int i = 1; i < n; i++)
    {
        int a;
        cin >> a;
        a--;
        t[i] = a;
        g[a].push_back(i);
    }
    k = round(sqrt(n / 2));
    dfs(0, 0, -1);
    while(m--)
    {
        int a, b;
        cin >> a >> b;
        a--; b--;
        while(bk[a] != bk[b])
        {
            if(h[a] < h[b])
                b = bk[b];
            else a = bk[a];
        }
        while(a != b)
        {
            if(h[a] < h[b])
                b = t[b];
            else a = t[a];
        }
        cout << a + 1 << '\n';
    }
    return 0;
}