#include
#include
using namespace std;
inline void read(int &a){
char c=getchar();int f=1;a=0;
while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0') a=(a<<1)+(a<<3)+c-48,c=getchar();
a*=f;
}
inline int max(int a,int b){return a>b?a:b;}
const int MAXN=300010;
struct edge{int u,v,pre;}e[MAXN];
int n,q,head[MAXN],fa[MAXN],cnt,s[MAXN],P,ans[MAXN],m[MAXN],t[MAXN],B[MAXN];
inline void addedge(int U,int V){
e[++cnt].u=U;e[cnt].v=V;e[cnt].pre=head[U];head[U]=cnt;
}
inline void getsum(int now){
for(int i=head[now];i;i=e[i].pre)
getsum(e[i].v),s[now]+=s[e[i].v],m[now]=max(m[now],s[e[i].v]);
++s[now];
}
inline void getans(int now){
ans[now]=now;
for(int i=head[now];i;i=e[i].pre){
getans(e[i].v);t[now]=ans[e[i].v];
B[e[i].v]=t[now];t[now]=fa[t[now]];
while(t[now]!=now&&max(s[now]-s[B[e[i].v]],m[B[e[i].v]])>max(s[now]-s[t[now]],m[t[now]]))
B[e[i].v]=t[now],t[now]=fa[t[now]];
if(max(s[now]-s[B[e[i].v]],m[B[e[i].v]])
}
}
int main(){
read(n);read(q);
for(int i=2;i<=n;++i) read(fa[i]),addedge(fa[i],i);
getsum(1);getans(1);
while(q--) read(P),printf("%d\n",ans[P]);
return 0;
}
太简单了不说思路