Cod sursa(job #3293848)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 12 aprilie 2025 18:48:41
Problema Lowest Common Ancestor Scor 10
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 - 1;
}
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;
    int p = x;
    for (int i = LOG; i >= 0; i--)
        if (IsAscensor(up[i][p], y) == false)
            p = up[i][p];
    return up[0][p];
}

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