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

def shuttlesort array
  1.step(array.size - 1, 1) do |i|
    target = array[i]
    insertion = nil;
    
    #挿入場所が見つかるまで右にずらす
    i.step(0, -1) do |j|
      insertion = j
      #釣った数が異なる場合
      if array[j - 1][1] > target[1] then
        break
      end
      #釣った数が同じ場合
      break if array[j - 1][1] == target[1] && array[j - 1][0] < target[0]
      array[j] = array[j - 1]
    end
    
    array[insertion] = target
  end
  array 
end

#入力を受け取る
n, q = $stdin.gets.chomp.split(" ").map(&:to_i)
#データ量に応じてハッシュテーブル長を変更する
HASH_LENGTH = (n < 500000)? 100 : 200

hash = Array.new(HASH_LENGTH).map{Array.new}
#各テーブルのトップを保持する
max = Array.new(HASH_LENGTH).map{Array.new(2).fill(-1)}

q.times do
  a, v = $stdin.gets.chomp.split(" ").map(&:to_i)
  #入力値をもとにハッシュテーブルを更新する
  key = a % HASH_LENGTH
  new = nil
  if new = hash[key].select{|sa, sv| sa == a}[0]
    new[1] += v
  else
    hash[key] << [a, v]
    new = [a, v]
  end
  hash[key] = shuttlesort hash[key]
  
  #対応キーのトップの更新
  max[key] = hash[key][0]

  #トップを取得する
  top = max.sort do |m1, m2|
    if m1[1] != m2[1]
      m2[1] <=> m1[1]
    else
      m1[0] <=> m2[0]
    end
  end[0]

  printf "%d %d\n", top[0], top[1]
end