Cod sursa(job #3346213)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 12 martie 2026 20:48:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;
struct tarjan{
    int source, dest, index_result;
};;
vector <int> G[100001];
vector <tarjan> E[100001];
tarjan queries[2000001];
int f[100001], disjoint[100001];

int find(int x){
    if(disjoint[x] == x) return x;
    return disjoint[x] = find(disjoint[x]);
}

void dfs(int i){
    disjoint[i] = find(disjoint[i]);
    f[i] = 1;
    for(auto it : G[i]){
        if(!f[it]){
            dfs(it);
            int rit = find(disjoint[it]);
            int ri = find(disjoint[i]);
            disjoint[rit] = ri;
        }
    }
    f[i] = 2;
    for(auto [_, j, index]: E[i])
        if(f[j] == 2){
            queries[index].index_result = disjoint[j] = find(disjoint[j]);
        }
}

int main() {
    int n, m;
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 2; i <= n; i++){
        int x;
        scanf("%d", &x);
        G[i].push_back(x);
        G[x].push_back(i);
        disjoint[i] = i;
    }
    disjoint[1] = 1;
    for(int i = 1; i <= m; i++){
        scanf("%d%d", &queries[i].source, &queries[i].dest);
        E[queries[i].source].push_back({0, queries[i].dest, i});
        E[queries[i].dest].push_back({0, queries[i].source, i});
    }
    dfs(1);
    for(int i = 1; i <= m; i++)
        printf("%d\n", queries[i].index_result);

    return 0;
}