显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int K = 40;
int nxt[200005];
long long v[200005];
long long x;
int jmp[200005][K+1];
long long s[200005][K+1], mn[200005][K+1];
int main() {
freopen("pathsjump.in","r",stdin);
freopen("pathsjump.out","w",stdout);
int n; cin >> n >> x;
for(int u=1; u<=n; ++u) cin >> nxt[u], ++nxt[u];
for(int u=1; u<=n; ++u) cin >> v[u];
for(int k=1; k<=K; ++k)
for(int u=1; u<=n; ++u)
if(k == 1) {
jmp[u][k] = nxt[u];
s[u][k] = v[u];
mn[u][k] = v[u];
} else {
jmp[u][k] = jmp[jmp[u][k-1]][k-1];
s[u][k] = s[u][k-1] + s[jmp[u][k-1]][k-1];
mn[u][k] = min(mn[u][k-1], mn[jmp[u][k-1]][k-1]);
}
for(int u=1; u<=n; ++u) {
long long ts = 0, tmn = LONG_LONG_MAX;
int p = u;
for(long long b=x, k=1; b; b>>=1, ++k)
if(b & 1) {
ts += s[p][k];
tmn = min(tmn, mn[p][k]);
p = jmp[p][k];
}
cout << ts << " " << tmn << "\n";
}
return 0;
}