显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,to[N][40],g[N][40];
ll f[N][40],k;
int main(){
freopen("pathsjump.in","r",stdin);
freopen("pathsjump.out","w",stdout);
scanf("%d %lld",&n,&k);
for(int i=1;i<=n;i++)scanf("%d",&to[i][0]);
for(int i=1;i<=n;i++)scanf("%lld",&f[i][0]),g[i][0]=f[i][0];
for(int i=1;i<=39;i++){
for(int j=1;j<=n;j++){
to[j][i]=to[to[j][i-1]][i-1];
f[j][i]=f[j][i-1]+f[to[j][i-1]][i-1];
g[j][i]=min(g[j][i-1],g[to[j][i-1]][i-1]);
}
}
for(int i=1,x;i<=n;i++){
int ans1=1e9;ll ans2=0;x=i;
for(int j=39;j>=0;j--){
if((k>>j)&1){
ans1=min(ans1,g[x][j]);
ans2+=f[x][j];
x=to[x][j];
}
}
printf("%lld %d\n",ans2,ans1);
}
return 0;
}