Cod sursa(job #1767242)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 28 septembrie 2016 20:47:41
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <vector>
using namespace std;

const int N=100005;
int d[N][20],l[N];
vector <int> G[N];

void dfs(int x){
    for(int i=0;i<(int)G[x].size();i++){
        int y=G[x][i];
        l[y]=l[x]+1;
        dfs(y);
    }
}

int lca(int x, int y){
    if(l[x]<l[y]) swap(x,y);
    int z=l[x]-l[y];
    for(int j=0;j<=17;j++)
        if((z&(1<<j))>0) x=d[x][j];

    if(x==y) return x;
    for(int j=17;j>=0;j--)
        if(d[x][j]!=d[y][j]){
            x=d[x][j];
            y=d[y][j];
        }
    return d[x][0];
}



int main(){
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);

    int n,m,x,i,j,a,b;

    scanf("%d%d",&n,&m);
    for(i=2;i<=n;i++){
        scanf("%d",&a);
        G[a].push_back(i);
        d[i][0]=a;
    }
    dfs(1);

    for(i=1;i<=n;i++)
        for(j=1;j<=17;j++)
            d[i][j]=d[d[i][j-1]][j-1];

    for(i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        x=lca(a,b);
        printf("%d\n",x);
    }


    return 0;
}