Cod sursa(job #2085026)

Utilizator anisca22Ana Baltaretu anisca22 Data 9 decembrie 2017 16:02:39
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define NMAX 100005

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

int N, M, sq, h;
int p[NMAX], p2[NMAX], lev[NMAX];
vector <int> v[NMAX];

void find_h(int nod, int niv)
{
    h = max(h, niv);
    vector <int> :: iterator it;
    for (it = v[nod].begin(); it != v[nod].end(); it++)
    {
        int nxt = *it;
        find_h(nxt, niv + 1);
    }
}

void dfs(int nod, int P, int niv)
{
    p2[nod] = P;
    lev[nod] = niv;
    if (niv % sq == 0)
        P = nod;
    vector <int> :: iterator it;
    for (it = v[nod].begin(); it != v[nod].end(); it++)
    {
        int nxt = *it;
        dfs(nxt, P, niv + 1);
    }
}

int lca(int x, int y)
{
    while (p2[x] != p2[y])
        if (lev[x] < lev[y])
            y = p2[y];
        else x = p2[x];
    while (x != y)
        if (lev[x] < lev[y])
            y = p[y];
        else x = p[x];
    return x;
}

int main()
{
    fin >> N >> M;
    for (int i = 2; i <= N; i++)
    {
        int x;
        fin >> x;
        v[x].push_back(i);
        p[i] = x;
    }
    find_h(1, 0);
    sq = sqrt(h);
    dfs(1, 1, 0);
    for (int i = 1; i <= M; i++)
    {
        int x, y;
        fin >> x >> y;
        fout << lca(x, y) << "\n";
    }
    return 0;
}