Cod sursa(job #1368864)

Utilizator sorynsooSorin Soo sorynsoo Data 2 martie 2015 20:24:40
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>
#include <vector>
using namespace std;
#define maxim 100005

vector<int> graf[maxim];
int d[maxim],tata[maxim];
int n,m,i,j,x,a,b;

void dfs(int nod, int nivel)
{
    d[nod]=nivel;

    for(int i=0; i<graf[nod].size(); i++)
    {
        if(!tata[graf[nod][i]])
        {
            tata[graf[nod][i]]=nod;
            dfs(graf[nod][i],nivel+1);
        }
    }
}

int lca(int a, int b)
{
    while(a!=b)
    {
        if(d[a]>d[b])
            a=tata[a];
        else
            b=tata[b];
    }
    return a;
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=2; i<=n; i++)
    {
        scanf("%d",&x);
        graf[x].push_back(i);
    }
    dfs(1,1);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&a,&b);
        printf("%d\n",lca(a,b));
    }
}