Cod sursa(job #2084641)

Utilizator leraValeria lera Data 9 decembrie 2017 11:13:31
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#define Nmax 100005
using namespace std;

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

int niv[Nmax], H, ad[Nmax], h, n, m, a, b, tata[Nmax], x;
vector<int>v[Nmax];
void DFS(int nod, int adancime, int nd)
{
    niv[nod] = nd;
    for(int i = 0 ; i < v[nod].size(); i++)
    {
        int fiu = v[nod][i];
        if(adancime % h == 0)DFS(fiu, adancime + 1, nod);
        else DFS(fiu, adancime + 1, nd);
    }
}
void dfs(int nod, int adancime)
{
    H = max(H, adancime);
    for(int i = 0 ; i < v[nod].size(); i++)
    {
        int fiu = v[nod][i];
        ad[fiu] = ad[nod] + 1;
        dfs(fiu, adancime + 1);
    }
}
int lca(int x, int y)
{
    while(niv[x] != niv[y])
    {
        if(ad[x] > ad[y]) x = niv[x];
        else y = niv[y];
    }

    while(x != y)
    {
       if(ad[x] > ad[y]) x = niv[x];
        else y = niv[y];
    }
    return x;
}
int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n - 1; i++)
    {
        fin >> x;
        tata[i + 1] = x;
        v[x].push_back(i + 1);
    }
    dfs(1, 1);
    h = sqrt(H);
    DFS(1, 1, 1);
    for(int i = 1;  i <= m; i++)
    {
        fin >> a >> b;
        fout << lca(a, b) << '\n';
    }
    return 0;
}