Cod sursa(job #2486141)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 2 noiembrie 2019 12:55:29
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<int> G[100005];
int TT[100005];
int level[100005];

int LCA(int x,int y){
    if(level[x] < level[y]){
        swap(x,y);
    }
    while(level[x] != level[y]){
        x = TT[x];
    }
    while(x != y){
        x = TT[x];
        y = TT[y];
    }
    return x;
}

void dfs(int x,int tata){
    level[x] = level[tata] + 1;
    for(int i = 0; i < G[x].size(); i++){
        dfs(G[x][i],x);
    }
}

int main ()
{
    int i,n,m,a1,a2;
    fin>>n>>m;
    for(i = 2; i <= n; i++){
        fin>>TT[i];
        G[TT[i]].push_back(i);
    }
    dfs(1,0);
    for(i = 1; i <= m; i++){
        fin>>a1>>a2;
        fout<<LCA(a1,a2)<<'\n';
    }
    return 0;
}