族谱书

#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;

const int A = 1e7+10;
const int B = 1e7+10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

inline int read() {
  char c = getchar();
  int x = 0, f = 1;
  for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
  for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
  return x * f;
}

struct node {int v,nxt;} e[B<<1];

int depmax,head[B],cnt,n,m,dep[B],mx[B],m1[B],m2[B],f[B],ans[B];

void modify(int u,int v)
{
    e[++cnt].v=v;
    e[cnt].nxt=head[u];
    head[u]=cnt;
}

int dfs1(int x,int d)
{
    mx[x]=dep[x]=d;
    depmax=max(depmax,mx[x]);
    
    for (int i=head[x];i;i=e[i].nxt)
    {
        int v=e[i].v;
        mx[x]=max(mx[x],dfs1(v,d+1));
        
        if (mx[v]>mx[m1[x]])
        {
            m2[x]=m1[x];
            m1[x]=v;
        }
        else if (mx[m2[x]]<mx[v]) 
        {
            m2[x]=v;
        }
    }
    
    return mx[x];
}

int dfs2(int u,int target)
{
    if (mx[m2[u]]>=target) return u;
    if (!mx[m1[u]] || dep[u]==target) return u;
    
    return dfs2(m1[u],target);
}

main()
{
    int x;
    n=read(),m=read();
    for (int i=1;i<=n;i++)
    {
        f[i]=read();
        modify(f[i],i);      
    }
    
    dfs1(1,1);
    ans[0]=1;    
    for (int i=1;i<=depmax;i++) ans[i]=dfs2(ans[i-1],i);
    
    for (int i=1;i<=m;i++)
    { 
        x=read(); 
        printf("%lld
",ans[x]);
    }
}
```c
原文地址:https://www.cnblogs.com/lToZvTe/p/14550191.html