Cod sursa(job #2509935)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 15 decembrie 2019 12:56:11
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

//varianta 5 - Bucati de radical

ifstream f("lca.in");
ofstream g("lca.out");

const int nmax = 100005;

int level[nmax];
int where[nmax];
int size[nmax];
int father[nmax];
int last[nmax];

vector <int> son[nmax];

int RAD;
int cnt = -1;

void dfs(int nod, int lvl)
{
    level[nod] = lvl;
    int found = 0;
    for (auto el : son[nod])
    {
        dfs(el, lvl + 1);
        if (size[where[el]] < RAD)
            found = el;
    }
    if (!found)
        where[nod] = ++ cnt;
    else
        where[nod] = where[found];

    last[where[nod]] = nod;
    assert(cnt < nmax);
    ++ size[where[nod]];
}

int solve(int a, int b)
{
    while (where[a] != where[b])
    {
        if (level[last[where[a]]] < level[last[where[b]]])
            swap(a, b);
        a = father[last[where[a]]];
    }
    if (level[a] < level[b])
        return a;
    else
        return b;
}

int main()
{
    int n, m;
    f >> n >> m;
    RAD = sqrt(n);
    for (int i = 1; i < n; ++ i)
    {
        int x;
        f >> x;
        son[x].push_back(i + 1);
        father[i + 1] = x;
    }
    dfs(1, 0);
    father[1] = 1;
    for (int i = 1; i <= m; ++ i)
    {
        int a, b;
        f >> a >> b;
        g << solve(a, b) << '\n';
    }
}