Cod sursa(job #1345441)

Utilizator gapdanPopescu George gapdan Data 17 februarie 2015 17:03:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <vector>
#define NMAX 100005

using namespace std;

int n, m, h=200;
int T2[NMAX],T[NMAX],L[NMAX];
vector<int>v[NMAX];

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=T[x];
            else y=T[y];
    }
    return x;
}

void citire()
{
    freopen("lca.in", "r", stdin);
    scanf("%d%d",&n,&m);
    for(int i = 2; i <= n; ++i)
    {
        scanf("%d",&T[i]);
        v[T[i]].push_back(i);
    }
    dfs(1,0,0);
}

void query()
{
    int x,y;
    freopen("lca.out", "w", stdout);
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
}

int main()
{
    citire();
    query();
    return 0;
}