Cod sursa(job #3293855)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 12 aprilie 2025 19:00:05
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, Q, timp;
int LOG;
bitset<100005> viz;
int in[100005], out[100005], up[20][100005];
vector<int> L[100005];

void DFS(int k, int tata)
{
    viz[k] = 1;
    in[k] = ++timp;

    up[0][k] = tata;
    for (int i = 1; i <= LOG; i++)
        up[i][k] = up[i - 1][up[i - 1][k]];

    for (int i : L[k])
        if (viz[i] == 0)
            DFS(i, k);

    out[k] = ++timp;
}
bool IsAscensor(int x, int y)
{
    return (in[x] <= in[y] && out[y] <= out[x]);
}
int LCA(int x, int y)
{
    if (IsAscensor(x, y)) return x;
    if (IsAscensor(y, x)) return y;
    for (int i = LOG; i >= 0; i--)
        if (IsAscensor(up[i][x], y) == false)
            x = up[i][x];
    return up[0][x];
}

int main()
{
    int i, j;
    fin >> n >> Q;
    LOG = ceil(log2(n));
    for (i = 2; i <= n; i++)
    {
        fin >> j;
        L[j].push_back(i);
    }
    DFS(1, 1);
    while (Q--)
    {
        fin >> i >> j;
        fout << LCA(i, j) << "\n";
    }
    return 0;
}