Cod sursa(job #2084592)

Utilizator cipri321Marin Ciprian cipri321 Data 9 decembrie 2017 10:58:18
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>
#define DIM 100001
#define DG 1000
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
int n,m;
int a,b;
int P[DIM];
int A[2][DIM],grupa=0,L[DIM];
vector<int> V[DIM];
void dfs(int nod,int level,int leg1,int leg2)
{
    if(L[nod])
        return;
    L[nod]=level;
    A[0][nod]=leg1,A[1][nod]=leg2;
    for(auto to:V[nod])
    {
        if(level%DG==0)
            dfs(to,level+1,nod,to);
        else
            dfs(to,level+1,nod,leg2);
    }
}
int lca(int a,int b)
{
    if(L[a]<L[b])
        swap(a,b);
    while(L[a]!=L[b])
    {
        if(L[A[1][a]]>=L[b])
            a=A[1][a];
        else
            a=A[0][a];
    }
    while(a!=b)
        a=P[a],b=P[b];
    return a;
}
int main()
{
    fi>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fi>>P[i];
        V[i].push_back(P[i]);
        V[P[i]].push_back(i);
    }
    dfs(1,1,1,1);
    for(int i=1;i<=m;i++)
    {
        fi>>a>>b;
        fo<<lca(a,b)<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}