Cod sursa(job #2368465)

Utilizator mateibanuBanu Matei Costin mateibanu Data 5 martie 2019 16:15:37
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

vector<int>v[100010];

int d[200005][22];
int p[100010];
int e[200005];
int a[200005];
int nr;

void df(int o,int ad){
    e[++nr]=o;
    a[nr]=ad;
    p[o]=nr;
    int l=v[o].size();
    for (int i=0;i<l;i++)
    {
        df(v[o][i],ad+1);
        e[++nr]=o;
        a[nr]=ad;
    }
}

int main()
{
    int n,m,i,x,y,j;
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=2;i<=n;i++){
        scanf("%d",&x);
        v[x].push_back(i);
    }
    df(1,0);
    for (i=1;i<=nr;i++) d[i][0]=e[i];
    for (j=1;(1<<j)<=nr;j++){
        for (i=1;i+(1<<j)-1<=nr;i++){
            if (a[d[i][j-1]]>a[d[i+(1<<(j-1))][j-1]]) d[i][j]=d[i+(1<<(j-1))][j-1];
            else d[i][j]=d[i][j-1];
        }
    }
    for (i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        if (p[x]>p[y]) swap(x,y);
        int k=log2(p[y]-p[x]+1);
        if (a[p[d[p[x]][k]]]>a[p[d[p[y]-(1<<k)+1][k]]]) printf("%d\n",d[p[y]-(1<<k)+1][k]);
        else printf("%d\n",d[p[x]][k]);
    }
    return 0;
}