Cod sursa(job #2397921)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 4 aprilie 2019 21:22:45
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 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];
int nivmax;

void dfsniv(int nod, int hc)
{
    h[nod] = hc;
    nivmax = max(nivmax, hc);
    for(int m : g[nod])
        dfsniv(m, hc + 1);
}

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

int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    int m;
    fin >> n >> m;
    for(int i = 2; i <= n; i++)
    {
        int a;
        fin >> a;
        t[i] = a;
        g[a].push_back(i);
    }
    dfsniv(1, 0);
    k = int(sqrt(nivmax));
    dfs(1, 0, -1);
    while(m--)
    {
        int a, b;
        fin >> 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];
        }
        fout << a << '\n';
    }
    return 0;
}