Cod sursa(job #2324942)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 21 ianuarie 2019 19:17:21
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, h[100005], dp[50][1000000];
vector <int> v[100005], E, L;
bool viz[100005];
void DFS(int nod, int level)
{
    E.push_back(nod);
    viz[nod] = 1;
    L.push_back(level);
    if(!h[nod])
        h[nod] = E.size()-1;

    for(int i = 0; i < v[nod].size(); i++)
    {
        if(!viz[v[nod][i]])
        {
            DFS(v[nod][i], level+1);
            E.push_back(nod);
            L.push_back(level);
        }
    }

}

int main()
{
    E.push_back(0);
    L.push_back(0);
    fin >> n >> m;
    for(int i = 1; i < n; i++)
    {
        int x;
        fin >> x;
        v[x].push_back(i+1);
        v[i+1].push_back(x);

    }
    DFS(1, 1);

    for(int i = 1; i < E.size(); i++)
        dp[0][i] = i;

    for(int i = 1; (1<<i) < E.size(); i++)
   {
       for(int j = 1; j+(1<<i) -1 < E.size(); j++)
        {
            if(L[dp[i-1][j]] < L[dp[i-1][j+(1<<(i-1))]])
                dp[i][j] = dp[i-1][j];
            else
                dp[i][j] = dp[i-1][j+(1<<(i-1))];
           // fout << dp[i][j] << " ";
        }
        //fout << '\n';
        }



    while(m--)
    {
        int a, b;
        fin >> a >> b;
        if(h[b] < h[a])
            swap(a,b);
        float k = log(h[b]-h[a]+1)/log(2);
        int x = (int) k;

        if(L[dp[x][h[a]]] < L[dp[x][h[b]-(1<<x)+1]])
            fout << E[dp[x][h[a]]] << '\n';
        else
            fout << E[dp[x][h[b]-(1<<x)+1]] << '\n';


    }

    return 0;
}