用的是倍增
#include<bits/stdc++.h>
using namespace std;
int n,m,s,Lca;
vector<int > G[500001];
int dep[500001],fa[500001][21];
void dfs(int u,int f)
{
for(int i=0;i<G[u].size();i++)
{
int v = G[u][i];
if(v==f)continue;
dep[v]=dep[u]+1;
fa[v][0] = u;
dfs(v,u);
}
}
int lca(int u,int v)
{
if(dep[v]<dep[u])swap(u,v);
for(int i=0;i<=20;i++)
{
if(((dep[v]-dep[u])>>i)&1)v = fa[v][i];
}
if(u==v) return u;
for(int i=20;i>=0;i--)
{
if(fa[u][i]==fa[v][i])continue;
u = fa[u][i];
v = fa[v][i];
}
return fa[u][0];
}
int main()
{
cin>>n;
s = 0;
for(int i=1;i<=n-1;i++)
{
int u;
cin>>u;
G[u].push_back(i);
}
dfs(s,0);
for(int i=1;i<=20;i++)
{
for(int u=1;u<=n;u++)
{
fa[u][i] = fa[fa[u][i-1]][i-1];
}
}
cin>>m;
for(int i=1;i<=m;i++)
{
int x,y,k;
cin>>k;
cin>>y;
cin>>x;
Lca = lca(x,y);
for(int j=3;j<=k;j++)
{
cin>>x;
Lca = lca(Lca,x);
}
cout<<Lca<<endl;
}
return 0;
}