显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pir pair<ll,ll>
#define ls first
#define rs second
#define mp make_pair
#define mod
#define MAXN 100010
#define qmod(x) (x>mod?x-mod:x)
inline ll read(){
ll x = 0,f = 1;
char c = getchar();
while(c < '0'||c > '9'){
if(c == '-')f = -1;
c = getchar();
}
while(c >= '0'&&c <= '9'){
x = x*10+c-'0';
c = getchar();
}
return x*f;
}
// ll hd[MAXN],ed[MAXN],nxt[MAXN];
// ll idx;
// void build(ll x, ll y){
// ++ idx;
// nxt[idx] = hd[x];
// ed[idx] = y;
// hd[x] = idx;
// }
// ll dfn[MAXN],lst[MAXN];
// bool ins[MAXN],inrol[MAXN];
// ll stp,scc;
// ll t[MAXN],tp;
// vector <ll> rol[MAXN],vec[MAXN];
ll n,k;
ll val[MAXN];
ll sum[MAXN][50],minz[MAXN][50],fa[MAXN][50];
ll ans_sum[MAXN],ans_minz[MAXN];
// void clear(ll y){
// ++ scc;
// while(tp > 0){
// ll now = t[tp];
// -- tp;
// rol[scc].push_back(now);
// ins[now] = false;
// inrol[now] = true;
// if(now == y)break;
// }
// }
// void Tarjan(ll now){
// ++ stp;
// dfn[now] = lst[now] = stp;
// ++ tp;
// t[tp] = now;
// ins[now] = true;
// for(int i = hd[now];i;i = nxt[i]){
// ll y = ed[i];
// if(!dfn[y]){
// Tarjan(y);
// lst[now] = min(lst[now], lst[y]);
// }else if(ins[y])lst[now] = min(lst[now], dfn[y]);
// }
// if(lst[now] >= dfn[now]){
// if(t[tp] == now) -- tp;
// else clear(now);
// }
// }
pir get_k(ll x){
ll re_sum = 0,re_min = 1e18;
ll res = k;
for(int i = 40;i >= 0; --i){
if(res >= (1ll << i)){
res -= 1ll << i;
re_sum += sum[x][i];
re_min = min(re_min, minz[x][i]);
x = fa[x][i];
}
}
return {re_sum, re_min};
}
// void dfs2(ll now){
// if(!inrol[now]){
// sum[now][0] = val[now];
// minz[now][0] = val[now];
// for(int i = 1;i <= 40; ++i)fa[now][i] = fa[fa[now][i - 1]][i - 1];
// for(int i = 1;i <= 40; ++i)sum[now][i] = sum[now][i - 1] + sum[fa[now][i - 1]][i - 1];
// for(int i = 1;i <= 40; ++i)minz[now][i] = min(minz[now][i - 1], minz[fa[now][i - 1]][i - 1]);
// }
// pir res = get_k(now);
// ans_minz[now] = res.rs;
// ans_sum[now] = res.ls;
// for(int i = hd[now];i;i = nxt[i]){
// ll y = ed[i];
// if(inrol[y])continue;
// dfs2(y);
// }
// }
// void solve(ll now){
// for(int i = 0;i < rol[now].size(); ++i){
// ll y = rol[now][i];
// sum[y][0] = val[y];
// minz[y][0] = val[y];
// // if(i == 0)fa[y][0] = rol[now][rol[now].size() - 1];
// // else fa[y][0] = rol[now][i - 1];
// }
// for(int i = 1;i <= 40; ++i){
// for(int j = 0;j < rol[now].size(); ++j){
// ll y = rol[now][j];
// fa[y][j] = fa[fa[y][j - 1]][j - 1];
// sum[y][j] = sum[y][j - 1] + sum[fa[y][j - 1]][j - 1];
// minz[y][j] = min(minz[y][j - 1], minz[fa[y][j - 1]][j - 1]);
// }
// }
// for(int i = 0;i < rol[now].size(); ++i){
// ll y = rol[now][i];
// dfs2(y);
// }
// }
int main(){
freopen("pathsjump.in", "r", stdin);
freopen("pathsjump.out", "w", stdout);
n = read(),k = read();
for(int i = 1;i <= n; ++ i){
fa[i][0] = read();
// build(fa[i][0], i);
}
for(int i = 1;i <= n; ++i){val[i] = read();
sum[i][0] = val[i];
minz[i][0] = val[i];
}
// for(int i = 1;i <= n; ++i){
// if(!dfn[i]){
// ll _stp = scc;
// Tarjan(i);
// if(scc > _stp){
// solve(scc);
// }
// }
// }
for(int i = 1;i <= 40; ++i){
for(int j = 1;j <= n; ++j){
// ll y = rol[now][j];
fa[j][i] = fa[fa[j][i - 1]][i - 1];
sum[j][i] = sum[j][i - 1] + sum[fa[j][i - 1]][i - 1];
minz[j][i] = min(minz[j][i - 1], minz[fa[j][i - 1]][i - 1]);
}
}
for(int i = 1;i <= n; ++i){
pir res = get_k(i);
cout << res.ls << " " << res.rs << endl;
}
return 0;
}