Cod sursa(job #2397899)

Utilizator zhm248Mustatea Radu zhm248 Data 4 aprilie 2019 21:07:41
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
int t[100001],niv[100001],arb[100001],nrarb,str[100001],maxniv;
vector<int>g[100001];
void dfsniv(int x)
{
    int i;
    niv[x]=niv[t[x]]+1;
    if(maxniv<niv[x])
        maxniv=niv[x];
    for(i=0;i<(int)g[x].size();++i)
    {
        dfsniv(g[x][i]);
    }
}

void dfs(int x,int sep)
{
    int i;
    if((niv[x]-1)%sep==0)
    {
        str[++nrarb]=t[x];
        arb[x]=nrarb;
    }
    else
        arb[x]=arb[t[x]];
    for(i=0;i<(int)g[x].size();++i)
    {
        dfs(g[x][i],sep);
    }
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int m,n,i,sep,x,y;
    scanf("%d%d",&n,&m);
    for(i=1;i<n;++i)
    {
        scanf("%d",&t[i+1]);
        g[t[i+1]].push_back(i+1);
    }
    dfsniv(1);
    sep=(int)sqrt(maxniv);
    dfs(1,sep);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        while(arb[x]!=arb[y])
        {
            if(niv[x]>=niv[y])
                x=str[arb[x]];
            else
                y=str[arb[y]];
        }
        while(x!=y)
        {
            if(niv[x]>=niv[y])
                x=t[x];
            else
                y=t[y];
        }
        printf("%d\n",x);
    }
    return 0;
}