using System; using System.Collections.Generic; using System.Linq; class Program { static string InputPattern = "InputX"; static List GetInputList() { var WillReturn = new List(); if (InputPattern == "Input1") { WillReturn.Add("3"); WillReturn.Add("1 0 4 1"); WillReturn.Add("2 4 15 4"); WillReturn.Add("0 0 1000000000000000000 1000000000000000000"); //3 //0 //1000000000000000000 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } static long[] GetSplitArr(string pStr) { return (pStr == "" ? new string[0] : pStr.Split(' ')).Select(pX => long.Parse(pX)).ToArray(); } static void Main() { List InputList = GetInputList(); long[] wkArr = { }; Action SplitAct = (pStr) => wkArr = GetSplitArr(pStr); foreach (string EachStr in InputList.Skip(1)) { SplitAct(EachStr); long SX = wkArr[0]; long SY = wkArr[1]; long TX = wkArr[2]; long TY = wkArr[3]; long Answer = Solve(SX, SY, TX, TY); Console.WriteLine(Answer); } } static long Solve(long pSX, long pSY, long pTX, long pTY) { long Answer = 0; // Y座標の移動コスト Answer += Math.Abs(pSY - pTY); long AnswerY = Math.Max(pSY, pTY); long Beki2 = 1; for (long I = 1; I <= AnswerY; I++) { if (WillOverProd(Beki2, 2, pSX) && WillOverProd(Beki2, 2, pTX)) { Beki2 = long.MaxValue; break; } else { Beki2 *= 2; } } long Div1 = (pSX / Beki2); long Div2 = (pTX / Beki2); Answer += Math.Abs(Div1 - Div2); return Answer; } // long型の2正数の掛け算が、Limitを超えるかを返す static bool WillOverProd(long pA, long pB, long pLimit) { return pA > pLimit / pB; } }