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 Control.Monad.ST
import Data.Functor
import Data.Function
import Data.Monoid
import Data.Maybe
import Data.List
import qualified Data.Foldable as Foldable
import qualified Data.Set as Set
import qualified Data.Sequence as Sequence
import Data.List.Split
import Data.Bits
import Data.Char
import Data.Ix
import Data.Ratio
import Data.Ord
import Data.Tuple
--import Data.Array
import Data.Array.IArray
--import Data.Array.Unboxed
import Data.Array.MArray
import Data.Array.IO
import Data.Array.ST
import Data.IORef
import Data.STRef
-- import System.IO.Unsafe
 
readInt = read :: String -> Int
readInteger = read :: String -> Integer
readDouble = read :: String -> Double
getInt = readLn :: IO Int
getInts = map readInt . words <$> getLine
getInteger = readLn :: IO Integer
getIntegers = map readInteger . words <$> getLine
getDouble = readLn :: IO Double
sjoin :: (Show a) => [a] -> String
sjoin = unwords . map show
cond :: a -> a -> Bool -> a
cond t f c = if c then t else f
apply2 :: (a -> a -> b) -> [a] -> b
apply2 f [x,y] = f x y
apply3 :: (a -> a -> a -> b) -> [a] -> b
apply3 f [x,y,z] = f x y z
apply4 :: (a -> a -> a -> a -> b) -> [a] -> b
apply4 f [x,y,z,w] = f x y z w
fnBin :: (b -> c -> d) -> (a -> b) -> (a -> c) -> a -> d
fnBin op f g x = op (f x) $ g x
fnTuple :: (a -> b, a -> c) -> a -> (b, c)
fnTuple (f,g) a = (f a, g a)
replace :: (Eq a) => a -> a -> [a] -> [a]
replace x y = map (\z -> if z==x then y else z)
modifyArray :: (Ix i, MArray a e m) => a i e -> i -> (e -> e) -> m ()
modifyArray arr ix f = readArray arr ix >>= writeArray arr ix . f
dictCompare :: [a -> a -> Ordering] -> a -> a -> Ordering
dictCompare [] _ _ = EQ
dictCompare (f:fs) x y = let c = f x y in if c==EQ then dictCompare fs x y else c
binMap :: (a -> a -> b) -> [a] -> [b]
binMap f (x:xs@(y:_)) = f x y : binMap f xs
binMap _ _ = []
-- end of templete



main = do
    n <- getInt
    m <- getInt
    as <- getInts
    bs <- replicateM m getInts
    mapM_ print $ map sum $ transpose $ zipWith (\x ys -> [if i==x then 1 + length (filter (/=x) ys) else cond 1 0 (x==y) | (y, i) <- zip ys [1..n]]) as bs