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: Time Limit Exceeded)

import Control.Monad

main :: IO ()
main = do
  nq <- getLine
  let [n,q] = map strToInt $ words nq
      assocL = []
      counter = 0
  loopq counter q assocL

strToInt :: String -> Int
strToInt str = read str

loopq :: Int -> Int -> [[Int]] -> IO ()
loopq counter q assocL = do
  if counter >= q
    then return ()
    else do
      av <- getLine
      let [a,v] = map strToInt $ words av
          assocL' = if search [a,v] assocL
                      then update [a,v] assocL
                      else [a,v]:assocL
          ans = format $ maxSearch assocL'
      putStrLn ans
      loopq (counter + 1) q assocL'

search :: [Int] -> [[Int]] -> Bool
search [a,b] xs = foldl f False xs
                          where f acc [x,_] = acc || (x == a)

update :: [Int] -> [[Int]] -> [[Int]]
update [x,y] ([x',y']:rest)
  | x == x' = [x,y+y']:rest
  | otherwise= [x',y']:(update [x,y] rest)

maxSearch :: [[Int]] -> [Int]
maxSearch xs = foldl1 f xs
                where f [a,b] [c,d]
                        | (b < d) || ((b == d) && (c < a)) = [c,d]
                        | otherwise = [a,b]

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