Cod sursa(job #3325707)

Utilizator Anul2024Anul2024 Anul2024 Data 26 noiembrie 2025 10:01:42
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int DIM = 100000, DIMP = 16;
int n, q;
int t[DIMP + 1][DIM + 1], niv[DIM + 1];
vector <int> v[DIM + 1];
void init ()
{
    fin >> n >> q;
    for (int i = 2; i <= n; i++)
    {
        fin >> t[0][i];
        v[t[0][i]].push_back (i);
    }
    for (int p = 1; (1 << p) <= n; p++)
    {
        for (int i = 1; i <= n; i++)
            t[p][i] = t[p - 1][t[p - 1][i]];
    }
}
void dfs (int nod, int p)
{
    niv[nod] = p;
    for (int i = 0; i < (int) v[nod].size (); i++)
    {
        int vecin = v[nod][i];
        dfs (vecin, p + 1);
    }
}
void solve ()
{
    int x, y;
    while (q--)
    {
        fin >> x >> y;
        if (niv[y] > niv[x])
            swap (x, y);
        int dif = niv[x] - niv[y];
        for (int p = 0; (1 << p) <= dif; p++)
        {
            if ((dif >> p) & 1)
                x = t[p][x];
        }
        for (int p = 0; (1 << p) <= n; p++)
        {
            if (t[p][x] != t[p][y])
                x = t[p][x], y = t[p][y];
        }
        if (x != y)
            x = t[0][x];
        fout << x << "\n";
    }
}
int main ()
{
    init ();
    dfs (1, 1);
    solve ();
    return 0;
}