Cod sursa(job #3221299)

Utilizator lucianul31Moisii Lucian lucianul31 Data 6 aprilie 2024 17:10:19
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#pragma GCC optimize ("Ofast,unroll-loops")
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 1e5 + 5;
const int MMAX = 2e6 + 5;
vector <int> Edges[NMAX];
vector <pair < int, int >> Queries[NMAX];
int N, M, Father[NMAX], Results[MMAX];
bool Visited[NMAX];

void make_set(int x)
{
    Father[x] = x;
}

int find_set(int x)
{
    if (Father[x] == x)
        return x;
    return Father[x] = find_set(Father[x]);
}

void union_sets(int x, int y)
{
    x = find_set(x);
    y = find_set(y);
    if (x != y)
        Father[y] = x;
}

void DFS(int x)
{
    make_set(x);
    Visited[x] = true;
    for(int it : Edges[x])
    {
        if (!Visited[it])
        {
            DFS(it);
            union_sets(x, it);
            Father[find_set(x)] = x;
        }
    }

    for(pair < int, int >  it : Queries[x])
    {
        if (Visited[it.first])
            Results[it.second] = Father[find_set(it.first)];
    }
}

int main()
{
    int x, y;
    in >> N >> M;
    for(int i = 2; i <= N; i++)
    {
        in >> x;
        Edges[x].push_back(i);
    }
    for(int i = 1; i <= M; i++)
    {
        in >> x >> y;
        Queries[x].push_back({y, i});
        Queries[y].push_back({x, i});
    }
    DFS(1);
    for(int i = 1; i <= M; i++)
        out << Results[i] << '\n';
    return 0;
}