Problem:
無限急行

ムゲン鉄道のムゲン線には無限個の駅があります。駅には …, -3, -2, -1, 0, 1, 2, 3, … と番号が振られていて、各駅は数直線上の整数と同じ順番で隣り合っています。あなたはいま、ある番号の駅から電車に乗り、それより大きな番号の駅に向かおうとしています。

ムゲン線には無限種類の快速電車が走っています。それらは 0 級快速、1 級快速、2 級快速、3 級快速、… のように番号で呼ばれています。n 級快速の電車は、2n の倍数の番号の駅に停車します。たとえば、1級快速は駅 …, -4, -2, 0, 2, 4, … に、3 級快速は駅 …, -24, -16, -8, 0, 8, 16, 24, … に停車するといった具合です。0 級快速はすべての駅に停車するので、本当は各駅停車ですがムゲン鉄道は「快速」と呼んでいます。

どの級の快速電車も、ある停車駅から次の停車駅まで移動するのに1単位時間かかります。また、快速電車間の乗り換えにかかる時間は無視できるものとします。乗車駅 s と降車駅 d が与えられたとき、s から d へ移動するのに必要な最小の時間を求めるプログラムを作成してください。ただし、s から d へ移動する間に、大きな番号から小さな番号の駅に向かっての移動は認められないものとします。

入力

入力は1つのデータセットからなる。入力データは以下の形式で与えられる。

N
s1 d1
s2 d2
:
sN dN

１行目に移動の回数を表す N (1 ≤ N ≤ 100) が与えられる。続く N 行に、乗車駅の番号 si と降車駅の番号 di (-1,000,000,000 ≤ si < di ≤ 1,000,000,000) が与えられる。

出力

与えられた乗車駅と降車駅ごとに、移動に必要な最小の時間を１行に出力する。

入出力例

入力例

3
0 7
-1048576 0
-3 5

出力例

3
1
4

Solution in Ruby (judge verdict: Accepted)


def f(a, b)
  k = Math::log2(b - a).to_i
  mask = ~((1 << k) - 1)

  c = b & mask
  if b == c
    a, b = -b, -a 
    c = b & mask
  end
  b == c ? 1 : f(a, c) + f(c, b)
end

n = STDIN.gets.to_i
n.times do
  s, d = STDIN.gets.split.map(&:to_i)
  puts f(s, d)
end