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 Ruby (judge verdict: Wrong Answer)

Node = Struct.new(:value, :members, :parent, :left, :right)

n, q = $<.gets.split.map(&:to_i)
table = {}

ai, vi = $<.gets.split.map(&:to_i)
root = Node.new(vi, [ai])
puts "#{ai} #{vi}"
table[ai] = vi

add = ->(num) {
  v = table[num]
  find = ->(node) {
    if v == node.value
      node.members += [num]
    elsif v < node.value
      node.left ? find.(node.left) : node.left = Node.new(v, [num], node) 
    else
      node.right ? find.(node.right) : node.right = Node.new(v, [num], node)
    end
  }
  find.(root)
}

find_max = ->(node) {
  node.right ? find_max.(node.right) : node
}

find = ->(v, node = root) {
  return nil unless node
  if v == node.value
    node
  elsif v < node.value
    find.(v, node.left)
  else
    find.(v, node.right)
  end
}

replace = ->(node, replaced) {
  if node.parent.right == node
    node.parent.right = replaced
  else
    node.parent.left = replaced
  end
}

delete_node = ->(node) {
  if node.left.nil? and node.right.nil?
    replace.(node, nil)
  elsif node.left and node.right
    max_node = find_max.(node.left)
    node, max_node = max_node, max_node.left
  elsif node.left
    node.left.parent = node.parent
    if node.parent
      replace.(node, node.left)
    else
      root = node.left
    end
  else
    node.right.parent = node.parent
    if node.parent
      replace.(node, node.right)
    else
      root = node.right
    end
  end
}

delete = ->(v, person) {
  node = find.(v)
  node.members -= [person]
  delete_node.(node) if node.members.empty?
}

(q - 1).times do
  a, v = $<.gets.split.map(&:to_i)
  tmp = table[a]
  table[a] = 0 unless tmp
  table[a] += v
  add.(a)
  delete.(tmp, a) if tmp
  max_node = find_max.(root)
  puts "#{max_node.members.min} #{max_node.value}"
end