sum[i][j]代表 j走过2^i个点的距离 ,mini[i][j]代表 j走过2^i个点经过的最小值 用rmq类似的思想进行推导
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 100005
#define LL long long
using namespace std;
LL po[38][maxn],sum[38][maxn],mini[38][maxn];
int main()
{
LL n,k;
scanf("%I64d%I64d",&n,&k);
for(LL i=1;i<=n;i++){scanf("%I64d",&po[0][i]),po[0][i]++;}
for(LL i=1;i<=n;i++)scanf("%I64d",&sum[0][i]),mini[0][i]=sum[0][i];
for(LL i=1;i<=35;i++)
for(LL j=1;j<=n;j++)
{
po[i][j] = po[i-1][po[i-1][j]];
sum[i][j] = sum[i-1][j]+sum[i-1][po[i-1][j]];
mini[i][j] = min(mini[i-1][j],mini[i-1][po[i-1][j]]);
}
for(LL i=1;i<=n;i++)
{
LL ansx = 0,ansy = (1ll<<35ll);
LL pre = i;
for(LL j=0;j<=35;j++)
if(k&(1ll<<j)){
ansx += sum[j][pre];
ansy = min(ansy,mini[j][pre]);
pre = po[j][pre];
}
printf("%I64d %I64d\n",ansx,ansy);
}
return 0;
}