Cod sursa(job #1643540)

Utilizator gapdanPopescu George gapdan Data 9 martie 2016 19:16:26
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <vector>
#define NMAX 100005

using namespace std;

int n,x,y,i,m;
int T2[NMAX],tata[NMAX],L[NMAX];
vector<int>v[NMAX];
int h=200;

void dfs(int nod,int tata,int niv)
{
    T2[nod]=tata;L[nod]=niv;
    if(niv%h == 0) tata=nod;
    for(int i=0; i<v[nod].size();++i)
        dfs(v[nod][i],tata,niv+1);
}

int lca(int x,int y)
{
    while(T2[x] != T2[y])
    {
        if(L[x] > L[y]) x=T2[x];
            else y=T2[y];
    }
    while(x != y)
    {
        if(L[x] > L[y]) x=tata[x];
            else y=tata[y];
    }
    return x;
}
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",&tata[i]);
        v[tata[i]].push_back(i);
    }
    dfs(1,0,0);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        int ans=lca(x,y);
        printf("%d\n",ans);
    }
    return 0;
}