Cod sursa(job #3181895)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 8 decembrie 2023 10:38:52
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

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

const int maxDim  = 1e5 + 5;

int T[maxDim] , ancestor[maxDim] , N , Q;
bool visited[maxDim];
vector <int> adList[maxDim] , q[maxDim];
vector <pair <int , int>> v;
map <pair<int , int> , int> Queries;

int Find (int N)
{
    if(T[N] != N)
        T[N] = Find(T[N]);
    return T[N];
}

void Union (int A , int B)
{
    int rA = Find(A) , rB = Find(B);
    if(rA != rB)
        T[rA] = rB;
}

void TarjanLCA (int Node)
{
    visited[Node] = 1;
    ancestor[Node] = Node;
    for(auto U : adList[Node])
        if(!visited[U])
        {
            TarjanLCA(U);
            Union(Node , U);
            ancestor[Find(Node)] = Node;
        }
    for(int U : q[Node])
        if(visited[U])
            Queries[{Node , U}] = ancestor[Find(U)];

}

int main()
{
    fin >> N >> Q;
    for(int i = 1; i <= N; ++i)
        T[i] = i;
    for(int i = 2; i <= N; ++i)
    {
        int X;
        fin >> X;
        adList[X].push_back(i);
        adList[i].push_back(X);
    }
    for(int i = 1; i <= Q; ++i)
    {
        int X , Y;
        fin >> X >> Y;
//        cout << X << " " << Y << endl;
        v.push_back({X , Y});
        q[X].push_back(Y);
        q[Y].push_back(X);
    }
    TarjanLCA(1);
    for(auto X : v)
    {
        int a = min(X.first , X.second);
        int b = max(X.first , X.second);
        fout << max(Queries[{X.first , X.second}],
                    Queries[{X.second,X.first}]) << '\n';
    }
}