Problem:
ワカサギ釣り大会 2

桧原湖でワカサギ釣り大会が行われました。今回はキャッチ＆リリースが推奨されているようです。

参加者番号と釣った匹数またはリリースした匹数を１つのイベントとして順番に読み込み、各イベントの直後に最も多くのワカサギを手元に獲得している参加者番号と匹数を出力するプログラムを作成してください。最も多く獲得している参加者が複数いる場合（あるいは全ての参加者が 0 匹の場合）は、その中で参加者番号が最も小さい一人を出力してください。

入力

入力は以下の形式で与えられる。

n q
a1 v1
a2 v2
:
aq vq

n (1 ≤ n ≤ 1000000) は参加者の数、q (1 ≤ q ≤ 100000)はイベントの数を表す。ai (1 ≤ ai ≤ n)   vi ( -100 ≤ vi ≤ 100) は、i 番目のイベントで参加者 ai が vi 匹獲得あるいはリリースしたことを示す。vi は正の値が獲得、負の値がリリースを示し、0 が与えられることはない。

出力

各イベントごとに、最も多くのワカサギを手元に獲得している参加者の参加者番号と匹数を１つの空白区切りで１行に出力する。

入力例1

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

出力例1

1 4
2 5
1 7
1 7
2 12

入力例2

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

出力例2

1 4
2 5
1 4
1 4
3 4

Solution in Haskell (judge verdict: Accepted)

import Data.Map (Map)
import qualified Data.Map as Map
import Control.Applicative
import Control.Monad

main :: IO ()
main = do
    [users, events] <- map (read::String -> Int) . words <$> getLine
    inputLines 0 events Map.empty ([]::[Int])
 
addDict map (fn:sn:_) = 
    Map.insertWithKey (\k x y -> x + y)  fn sn map

getHeighest [x] = x
getHeighest xs = do
    if (length greater > 0)
        then getHeighest greater 
        else (xu, xn)
    where
        h = (length xs) `div` 2
        (xu, xn) = xs !! h
        greater = [(u, n) | (u, n) <- xs, xn < n || (xn == n && u < xu)]
            

format :: (Int,Int) -> String
format (a,b) = (show a) ++ " " ++ (show b)

inputLines n limit acc higher = do
  if n < limit
    then do
      s <- map (read::String -> Int) . words <$> getLine
      let dict = addDict acc s
      let t = f higher s dict
      putStrLn $ format t
      inputLines (n + 1) limit dict [fst t, snd t]
    else return ()
        where
            f :: [Int] -> [Int] -> Map.Map Int Int -> (Int, Int)
            f [] _ dict = getHeighest . Map.toList $ dict
            f (h:hx:_) (s:sx:_) dict =
                if (sx < 0 && h == s)
                then getHeighest . Map.toList $ dict
                else if (hv < sv || (hv == sv && s < h))
                    then (s, sv)
                    else (h, hv)
                where
                    hv = dict Map.! h
                    sv = dict Map.! s