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)

data SegTree = Empty { contents :: (Int,Int)
                      ,maxcont :: (Int,Int)}| 
               Node { contents :: (Int,Int)
                     ,maxcont :: (Int,Int)
                     ,leftTree :: SegTree
                     ,rightTree :: SegTree}

empty :: SegTree
empty = Empty (-1,-1) (-1,-1)

comp :: (Int,Int) -> (Int,Int) -> (Int,Int)
comp (a,b) (x,y)
  | b == y = ((min a x),b)
  | b < y  = (x,y)
  | b > y  = (a,b)

insert :: (Int,Int) -> SegTree -> SegTree
insert (x,y) (Empty _ _) = (Node (x,y) (x,y) empty empty)
insert (x,y) (Node (a,b) (c,d) left right)
  | x == a = Node (a,b+y) (c,d) left right
  | x < a  = Node (a,b) (c,d) (insert (x,y) left) right
  | x > a  = Node (a,b) (c,d) left (insert (x,y) right)

update :: Int -> SegTree -> SegTree
update _ (Empty _ _) = empty
update x (Node (a,b) (c,d) left right)
  | x == a = Node
                (a,b)
                ((a,b) `comp` (maxcont left) `comp` (maxcont right))
                left
                right
  | x < a  = Node
                (a,b)
                ((a,b) `comp` (maxcont (update x left)) `comp` (maxcont right))
                (update x left)
                right
  | x > a  = Node
                (a,b)
                ((a,b) `comp` (maxcont (update x right)) `comp` (maxcont left))
                left
                (update x right)

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

main :: IO ()
main = do
  nq <- getLine
  let [n,q] = map (read :: String -> Int) $ words nq
      counter = q
      initTree = empty
  loopq counter initTree

loopq counter tree = do
  if counter <= 0
    then return ()
    else do
      av <- getLine
      let [a,v] = map (read :: String -> Int) $ words av
          tree' = update a $ insert (a,v) tree
          ans = maxcont tree'
      putStrLn $ format ans
      loopq (counter - 1) tree'