Cod sursa(job #3128065)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 8 mai 2023 15:18:15
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
#define usu 317

using namespace std;

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

const int nmax = 1e5 + 3;

int lvl[nmax], t[nmax], t2[nmax], n, ts, a, b;

vector <int> v[nmax];

void dfs(int nod, int ant, int lv)
{
    lvl[nod] = lv;
    t2[nod] = ant;
    if (lv % nod == 0)
        ant = nod;

    for (int i = 0; i < v[nod].size(); ++i)
        dfs(v[nod][i], ant, lv + 1);
}

int main()
{
    ios::sync_with_stdio(false);
    f >> n >> ts;

    for (int i = 2; i <= n; ++i)
    {
        f >> t[i];
        v[t[i]].push_back(i);
    }

    dfs(1, 0, 0);

    while (ts--)
    {
        f >> a >> b;

        while (t2[a] != t2[b])
        {
            if (lvl[a] > lvl[b])
                a = t2[a];
            else b = t2[b];
        }

        while (a != b)
        {
            if (lvl[a] > lvl[b])
                a = t[a];
            else b = t[b];
        }

        g << a << '\n';
    }

    return 0;
}