Problem:
クリスマスパーティー (Christmas Party)

問題

JOI 君は友達 1 から友達 N までの N 人の友達を招いてクリスマスパーティーを行った．クリスマスパーティーも盛り上がってきたところで，友達と一緒に次のようなゲームを行うことになった．

最初に JOI 君は N 人の友達の中から 1 人を選ぶ．以降はその友達をターゲットと呼ぶことにする．

JOI 君は，ターゲットとして選んだ友達に，その人がターゲットであることをこっそり伝える．ターゲット以外の友達は，誰がターゲットかを知ることはできない．

ターゲット以外の友達はそれぞれ，ターゲットが誰かを予想して，その人の名前を紙に記入する．ターゲットは自分自身の名前を紙に記入する．

すべての人の記入が終わった後，JOI 君はターゲットの名前を発表する．

予想が当たった人は 1 点を得る．なお，ターゲットは自分自身の名前を紙に記入しているので，必ず 1 点を得る．予想が外れた人には得点は与えられない．

それに加えて，予想が外れた人の人数を X 人としたとき，ターゲットは追加で X 点を得る．

JOI 君たちはこのゲームを M 回行った．それぞれの友達に対して，M 回のゲームにおける合計得点を求めよ．

入力

入力は 3 + M 行からなる．

1 行目には，友達の人数 N (3 ≤ N ≤ 100) が書かれている．

2 行目には，JOI 君たちが行ったゲームの回数 M (3 ≤ M ≤ 100) が書かれている．

3 行目には，M 個の整数 A1, A2, ..., AM が空白を区切りとして書かれている．これは，i 回目 (1 ≦ i ≦ M) のゲームのターゲットが友達 Ai (1 ≤ Ai ≤ N) であることを表す．

続く M 行のうちの i 行目 (1 ≦ i ≦ M) には，N 個の整数 Bi,1, Bi,2, ..., Bi,N が空白を区切りとして書かれている．これは，i 回目のゲームにおいて友達 j (1 ≤ j ≤ N) が友達 Bi,j (1 ≤ Bi,j ≤ N) の名前を紙に記入したことを表す．ターゲットは自分自身の名前を紙に記入するので，j = Ai のとき，常に Bi,j = j である．

出力

それぞれの友達に対して，M 回のゲームにおける合計得点を出力せよ．出力は N 行からなる．j 行目 (1 ≤ j ≤ N) に友達 j の合計得点を出力せよ．

入出力例

入力例 1

3
4
1 2 3 2
1 1 2
3 2 2
1 1 3
2 2 2

出力例 1

3
4
5

入力例 2

5
3
3 3 1
2 4 3 3 3
4 3 3 3 1
1 3 4 1 1

出力例 1

3
1
6
3
2

入出力例 1 では 3 人の友達が 4 回のゲームを行う．

1 回目のゲームのターゲットは友達 1 であり，友達 1 は 2 点，友達 2 は 1 点，友達 3 は 0 点を得る．

2 回目のゲームのターゲットは友達 2 であり，友達 1 は 0 点，友達 2 は 2 点，友達 3 は 1 点を得る．

3 回目のゲームのターゲットは友達 3 であり，友達 1 は 0 点，友達 2 は 0 点，友達 3 は 3 点を得る．

4 回目のゲームのターゲットは友達 2 であり，友達 1 は 1 点，友達 2 は 1 点，友達 3 は 1 点を得る．

4 回のゲーム終了後の合計得点は，友達 1 は 3 点，友達 2 は 4 点，友達 3 は 5 点である．

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Haskell (judge verdict: Accepted)

import Control.Applicative ((<$>), (<*>))
import Control.Monad
import Data.List
import Data.Array.Unboxed

main :: IO ()
main = do
  n <- getl toInt
  m <- getl toInt
  solve n <$> getl (wrds toInt) <*> replicateM m (getl $ wrds toInt) >>= mapM_ print

solve :: Int -> [Int] -> [[Int]] -> [Int]
solve n ms ns = map sum $ transpose $ map elems $ f ms ns
  where
    f :: [Int] -> [[Int]] -> [UArray Int Int]
    f [] [] = []
    f (x:xs) (ys:yss) = accum (+) (listArray (1,n) zs) [(x,length $ filter (==0) zs)] : f xs yss
      where zs = map (\c -> if x == c then 1 else 0) ys

toInt :: String -> Int
toInt = read

wrds :: (String -> a) -> String -> [a]
wrds f = map f . words

getl :: (String -> a) -> IO a
getl f = f <$> getLine