显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int maxm = 45;
typedef long long ll;
const ll INF = 1e9;
int n,a[maxn];
ll k,c[maxn],f[maxn][maxm],tot[maxn][maxm],sum[maxn][maxm];
ll solvetot(int i,ll k) {
if(!k)return 0;
int x = 0;
for(;(1ll << x) <= k;++ x);-- x;
return tot[i][x] + solvetot(f[i][x] , k ^ (1ll << x));
}
ll solvemin(int i,ll k) {
if(!k)return INF;
int x = 0;
for(;(1ll << x) <= k;++ x);-- x;
return min(sum[i][x] , solvemin(f[i][x] , k ^ (1ll << x)));
}
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",&a[i]),f[i][0] = a[i];
for(int i = 1;i <= n;++ i)scanf("%lld",&c[i]),sum[i][0] = tot[i][0] = c[i];
for(int t = 1;t <= 40;++ t) {
for(int i = 1;i <= n;++ i) {
f[i][t] = f[f[i][t - 1]][t - 1];
}
}
for(int t = 1;t <= 40;++ t) {
for(int i = 1;i <= n;++ i) {
sum[i][t] = min(sum[i][t - 1] , sum[f[i][t - 1]][t - 1]);
tot[i][t] = tot[i][t - 1] + tot[f[i][t - 1]][t - 1];
}
}
for(int i = 1;i <= n;++ i) {
printf("%lld %lld\n",solvetot(i , k),solvemin(i , k));
}
return 0;
}