L2-043 龙龙送外卖

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
int n, m;
int p[MAXN], f[MAXN];
int maxv;
//从u结点走,向根节点(已经经过的结点)走了d步,返回走了的最大步数
int dfs(int u, int d){
if(p[u] == -1 || f[u]){
maxv = max(maxv, d + f[u]);
return d * 2;
}
int t = dfs(p[u], d + 1);
f[u] = f[p[u]] + 1;
return t;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
int x;
cin >> x;
p[i] = x;
}
int sum = 0;
for(int i = 1; i <= m; i++){
int x;
cin >> x;
sum += dfs(x, 0);
cout << sum - maxv << endl;
}
return 0;
}