You are given a functional graph. It is a directed graph, in which from each vertex goes exactly one arc. The vertices are numerated from 0 to n - 1.

Graph is given as the array f0, f1, ..., fn - 1, where fi — the number of vertex to which goes the only arc from the vertex i. Besides you are given array with weights of the arcs w0, w1, ..., wn - 1, where wi — the arc weight from i to fi.

<image> The graph from the first sample test.

Also you are given the integer k (the length of the path) and you need to find for each vertex two numbers si and mi, where:

  * si — the sum of the weights of all arcs of the path with length equals to k which starts from the vertex i; 
  * mi — the minimal weight from all arcs on the path with length k which starts from the vertex i. 



The length of the path is the number of arcs on this path.

Input

The first line contains two integers n, k (1 ≤ n ≤ 105, 1 ≤ k ≤ 1010). The second line contains the sequence f0, f1, ..., fn - 1 (0 ≤ fi < n) and the third — the sequence w0, w1, ..., wn - 1 (0 ≤ wi ≤ 108).

Output

Print n lines, the pair of integers si, mi in each line.

Examples

Input

7 3
1 2 3 4 3 2 6
6 3 1 4 2 2 3


Output

10 1
8 1
7 1
10 2
8 2
7 1
9 3


Input

4 4
0 1 2 3
0 1 2 3


Output

0 0
4 1
8 2
12 3


Input

5 3
1 2 3 4 0
4 1 2 14 3


Output

7 1
17 1
19 2
21 3
8 1
#include <bits/stdc++.h>
using namespace std;
long long bigmod(long long b, int p) {
  if (p == 0) return 1;
  long long my = bigmod(b, p / 2);
  my *= my;
  my %= 1000000007;
  if (p & 1) my *= b, my %= 1000000007;
  return my;
}
int setb(int n, int pos) { return n = n | (1 << pos); }
int resb(int n, int pos) { return n = n & ~(1 << pos); }
bool checkb(int n, int pos) { return (bool)(n & (1 << pos)); }
struct info {
  long long v, sum, mn;
};
info ara[100005][36];
long long n, lol[100005][2];
void prework() {
  long long i, k;
  for (i = 0; i < n; i++) {
    ara[i][0].v = lol[i][0];
    ara[i][0].sum = lol[i][1];
    ara[i][0].mn = lol[i][1];
  }
  for (k = 1; k < 35; k++) {
    for (i = 0; i < n; i++) {
      ara[i][k].v = ara[ara[i][k - 1].v][k - 1].v;
      ara[i][k].sum = ara[i][k - 1].sum + ara[ara[i][k - 1].v][k - 1].sum;
      ara[i][k].mn = min(ara[i][k - 1].mn, ara[ara[i][k - 1].v][k - 1].mn);
    }
  }
}
info go(long long idx, long long x) {
  long long cur = 1, i;
  for (i = 1; i <= 34; i++) cur *= 2;
  long long u = idx;
  info ret;
  ret.sum = 0;
  ret.mn = INT_MAX;
  for (i = 34; i >= 0; i--) {
    if (x >= cur) {
      ret.sum = ret.sum + ara[u][i].sum;
      ret.mn = min(ret.mn, ara[u][i].mn);
      u = ara[u][i].v;
      x -= cur;
    }
    cur /= 2;
  }
  return ret;
}
int main() {
  long long i, k;
  scanf("%lld %lld", &n, &k);
  for (i = 0; i < n; i++) scanf("%lld", &lol[i][0]);
  for (i = 0; i < n; i++) scanf("%lld", &lol[i][1]);
  prework();
  for (i = 0; i < n; i++) {
    info ret = go(i, k);
    printf("%lld %lld\n", ret.sum, ret.mn);
  }
  return 0;
}
