显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
ll n,k,a[N][45],b[N][45],c[N][45];
ll query1(int idx,ll t) {
ll res=0;
while (t) {
ll sum=1,cnt=0;
while (sum<=t) {
cnt++;
sum<<=1;
}
cnt--;
sum>>=1;
res+=b[idx][cnt];
idx=a[idx][cnt];
t-=sum;
}
return res;
}
ll query2(int idx,ll t) {
ll res=1e18+10;
while (t) {
ll sum=1,cnt=0;
while (sum<=t) {
cnt++;
sum<<=1;
}
cnt--;
sum>>=1;
res=min(res,c[idx][cnt]);
idx=a[idx][cnt];
t-=sum;
}
return res;
}
int main () {
freopen("pathsjump.in","r",stdin);
freopen("pathsjump.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin >> n >> k;
for (int i=1;i<=n;i++) {
cin >> a[i][0];
}
for (int i=1;i<=n;i++) {
cin >> b[i][0];
c[i][0]=b[i][0];
}
for (int i=1;i<=40;i++) {
for (int j=1;j<=n;j++) {
a[j][i]=a[a[j][i-1]][i-1];
}
}
for (int i=1;i<=40;i++) {
for (int j=1;j<=n;j++) {
b[j][i]=b[j][i-1]+b[a[j][i-1]][i-1];
}
}
for (int i=1;i<=40;i++) {
for (int j=1;j<=n;j++) {
c[j][i]=min(c[j][i-1],c[a[j][i-1]][i-1]);
}
}
for (int i=1;i<=n;i++) {
cout << query1(i,k) <<' '<< query2(i,k) <<endl;
}
return 0;
}