AT_tkppc3_i 王国と M 種類の店
Description
[problemUrl]: https://atcoder.jp/contests/tkppc3/tasks/tkppc3_i
配点: $ 1100 $ 点
PAKEN 王国は, $ N $ 頂点の木の構造をしている. 木の頂点 $ i $ $ (2\ \leq\ i\ \leq\ N) $ は 頂点 $ P_i $ と, 長さ $ L_i $ で結ばれている.
王国には, 文房具店・スーパーマーケットなど, $ M $ 種類の店がある. (種類 $ 1 $, $ 2 $, ..., 種類 $ M $ とよぶことにします) 各頂点にはちょうど $ 1 $ 個店があり, 頂点 $ i $ には店 $ R_i $ がある.
頂点 $ i $ の **「不便さ」** は, 頂点 $ i $ からの (最寄りの種類 $ 1 $ の店までの最短距離) + (最寄りの種類 $ 2 $ の店までの最短距離) + ... + (最寄りの種類 $ M $ の店までの最短距離) と定義する.
そのとき, 頂点 $ 1 $, 頂点 $ 2 $, 頂点 $ 3 $, ..., 頂点 $ N $ それぞれに対する不便さを求めよ.
Input Format
入力は以下の形式で標準入力から与えられる.
> $ N $ $ M $ $ P_2 $ $ P_3 $ ... $ P_N $ $ L_2 $ $ L_3 $ ... $ L_N $ $ R_1 $ $ R_2 $ $ R_3 $ ... $ R_N $
$ 1 $ 行目には, 頂点数 $ N $ と, 店の種類数 $ M $ が空白区切りで入力される.
$ 2 $ 行目には, 辺の情報 $ P_2,\ P_3,\ ...,\ P_N $ が空白区切りで与えられる.
$ 3 $ 行目には, 辺の長さの情報 $ L_2,\ L_3,\ ...,\ L_N $ が空白区切りで与えられる.
$ 4 $ 行目には, 店の種類の情報 $ R_1,\ R_2,\ R_3,\ ...,\ R_N $ が空白区切りで与えられる. $ R_i $ は, 頂点 $ i $ の店の種類を表す.
Output Format
$ i $ 行目には, 頂点 $ i $ の不便さを $ 1 $ 行で出力せよ.
Explanation/Hint
### 注意
入力サイズが $ 1 $ ケース当たり $ 7.5\ MB $ 程度と大きいので, C++ の場合 cin/cout ではなく scanf/printf を使うことが推奨される.
### 制約
- $ N $ は $ 1 $ 以上 $ 400\ 000 $ 以下の整数.
- $ M $ は $ 1 $ 以上 $ 400\ 000 $ 以下の整数.
- $ P_i $ は $ 1 $ 以上 $ i\ -\ 1 $ 以下の整数.
- $ L_i $ は $ 1 $ 以上 $ 1\ 000\ 000 $ 以下の整数.
- $ R_i $ は $ 1 $ 以上 $ M $ 以下の整数.
- 種類 $ 1 $ から $ M $ まで, 全種類の店が $ 1 $ 個以上ある.
### 小課題
小課題1 \[ $ 55 $点 \]
- $ N\ \leq\ 1\ 500 $ を満たす.
- $ M\ \leq\ 750 $ を満たす.
小課題2 \[ $ 110 $点 \]
- $ N,\ M\ \leq\ 70\ 000 $ を満たす.
- $ N\ =\ M $ を満たす.
小課題3 \[ $ 275 $点 \]
- $ N,\ M\ \leq\ 70\ 000 $ を満たす.
- 同じ種類の店は王国中に高々 $ 8 $ 個しか存在しない.
小課題4 \[ $ 330 $点 \]
- $ N,\ M\ \leq\ 70\ 000 $ を満たす.
小課題5 \[ $ 330 $点 \]
- $ N,\ M\ \leq\ 400\ 000 $ を満たす.