Cod sursa(job #2170949)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 15 martie 2018 10:30:33
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include<bits/stdc++.h>
using namespace std;
int N,M,x,y,T[100001],level[100001],t[100001];
vector <int> G[100001];
void dfs(int nod,int par,int niv){
    level[nod]=niv;
    T[nod]=par;
    for(int i=0;i<G[nod].size();++i)
        dfs(G[nod][i],nod,niv+1);
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=2;i<=N;++i){
        scanf("%d",&t[i]);
        G[t[i]].push_back(i);
    }
    level[1]=1;
    dfs(1,0,0);
    while(M--){
        scanf("%d%d",&x,&y);
        while(T[x]!=T[y])
            if(level[x]>level[y])x=T[x];
            else y=T[y];
        while(x!=y)
            if(level[x]>level[y])x=t[x];
            else y=t[y];
        printf("%d\n",x);
    }
    return 0;
}