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.
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.
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).
Print n lines, the pair of integers si, mi in each line.
7 3
1 2 3 4 3 2 6
6 3 1 4 2 2 3
10 1
8 1
7 1
10 2
8 2
7 1
9 3
4 4
0 1 2 3
0 1 2 3
0 0
4 1
8 2
12 3
5 3
1 2 3 4 0
4 1 2 14 3
7 1
17 1
19 2
21 3
8 1
题目链接:http://codeforces.com/contest/702/problem/E
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define FOR(i,a,b) for(i=a;i<=b;i++) 4 using namespace std; 5 ll f[100001][50],sum,w[100001][50],s[100001][50]; 6 int main() { 7 8 ll i,j,k,x,m,n; 9 cin>>n>>k; 10 FOR(i,0,n-1) 11 cin>>f[i][0]; 12 FOR(i,0,n-1) 13 { 14 cin>>w[i][0]; 15 s[i][0]=w[i][0]; 16 } 17 FOR(j,1,45) 18 FOR(i,0,n-1) 19 { 20 f[i][j]=f[f[i][j-1]][j-1]; 21 w[i][j]=min(w[i][j-1],w[f[i][j-1]][j-1]); 22 s[i][j]=s[i][j-1]+s[f[i][j-1]][j-1]; 23 } 24 25 FOR(i,0,n-1) 26 { 27 m=w[i][0]; 28 x=i; 29 sum=0; 30 FOR(j,0,45) 31 { 32 if(k&1LL<<j) 33 { 34 sum+=s[x][j]; 35 m=min(m,w[x][j]); 36 x=f[x][j]; 37 } 38 } 39 cout<<sum<<" "<<m<<endl; 40 } 41 return 0; 42 }