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)

{-# OPTIONS_GHC -O3 -fexpose-all-unfoldings -fdicts-cheap -fdicts-cheap #-}

import Data.Int (Int32)
import Data.Array.IO
import Data.List (minimumBy,foldl1')
import Data.Ord (comparing)

acmArray :: IOUArray Int32 Int32 -> (Int32,Int32) -> IO (IOUArray Int32 Int32)
acmArray arr (x,y) = do
  s <- readArray arr x
  writeArray arr x (s + y)
  return arr

maxsnd (a,b) (c,d)  
  | b > d           = (a,b)
  | b == d && a < c = (a,b)
  | otherwise       = (c,d)

filt (a,b) (c,d) = b >= d
filt2 (a,b) (c,d) = a /= c

toPut (x,y) = show x ++ " " ++ show y

listToTuple :: [(Int32,Int32)] -> (Int32,Int32)
listToTuple [(x,y)] = (x,y)

judge :: (Int32,Int32) -> (Int32,Int32) -> [(Int32,Int32)] -> IOUArray Int32 Int32 -> IO (Int32, Int32)
judge (a,b) (x,y) xs arr = do
  if (a /= x) && ((b > y) || (b == y && a < x)) then return (a,b)
     else do
       let tes' = foldl1' maxsnd xs
       return (tes')

putresult arr xs n (a,b) = do
  s' <- getLine
  let [x,y'] = map (read :: String -> Int32) $ words s'
  acmArray arr (x,y')
  y <- readArray arr x
 
  let xs' = (x,y) : (filter (filt2 (x,y)) xs)

  (a',b') <-  judge (a,b) (x,y) xs' arr

  putStrLn $ toPut (a',b')

  if n < 2 then return ()
  else do
--    test <- getAssocs arr
--    print test
    putresult arr xs' (n-1) (a',b')

main = do
  s <- getLine
  let [x,n] = map read $ words s
  arr <- newArray (1,x) 0 :: IO (IOUArray Int32 Int32)
  putresult arr [] n (1,0)