显示代码纯文本
#include<cstdio>
#define N 100005
#define ll long long
using namespace std;
int n,d[N],fa[N][41],m[N][41];ll k,s[N][41];
int min(int x,int y){return x<y?x:y;}
void init(){
for(int k=1;k<41;k++)
for(int i=1;i<=n;i++)
fa[i][k]=fa[fa[i][k-1]][k-1],
m[i][k]=min(m[i][k-1],m[fa[i][k-1]][k-1]),
s[i][k]=s[i][k-1]+s[fa[i][k-1]][k-1];
}
void fd(int x){
int t=0,mi=2147483647;ll n=k,su=0;
while(n)
{
if(n&1)mi=min(mi,m[x][t]),su+=s[x][t],x=fa[x][t];
t++;
n>>=1;
}
printf("%lld %d\n",su,mi);
}
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",fa[i]);
for(int i=1;i<=n;i++)scanf("%d",m[i]),s[i][0]=m[i][0];
init();
for(int i=1;i<=n;i++)fd(i);
return 0;
}