Problem:
Score : 600 points

Problem Statement

For a non-negative integer K, we define a fractal of level K as follows:

A fractal of level 0 is a grid with just one white square.

When K > 0, a fractal of level K is a 3^K \times 3^K grid. If we divide this grid into nine 3^{K-1} \times 3^{K-1} subgrids:

The central subgrid consists of only black squares.

Each of the other eight subgrids is a fractal of level K-1.

For example, a fractal of level 2 is as follows:

In a fractal of level 30, let (r, c) denote the square at the r-th row from the top and the c-th column from the left.

You are given Q quadruples of integers (a_i, b_i, c_i, d_i).
For each quadruple, find the distance from (a_i, b_i) to (c_i, d_i).

Here the distance from (a, b) to (c, d) is the minimum integer n that satisfies the following condition:

There exists a sequence of white squares (x_0, y_0), \ldots, (x_n, y_n) satisfying the following conditions:

(x_0, y_0) = (a, b)

(x_n, y_n) = (c, d)

For every i (0 \leq i \leq n-1), (x_i, y_i) and (x_{i+1}, y_{i+1}) share a side.

Constraints

1 \leq Q \leq 10000

1 \leq a_i, b_i, c_i, d_i \leq 3^{30}

(a_i, b_i) \neq (c_i, d_i)

(a_i, b_i) and (c_i, d_i) are white squares.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

Q
a_1 \ b_1 \ c_1 \ d_1
:
a_Q \ b_Q \ c_Q \ d_Q

Output

Print Q lines.
The i-th line should contain the distance from (a_i, b_i) to (c_i, d_i).

Sample Input 1

2
4 2 7 4
9 9 1 9

Sample Output 1

5
8

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;
typedef long long ll;
typedef pair<int,int>P;

ll N=1;

ll a,b,c,d;
ll cost;

void solve(ll sz){
	ll x1=a/sz,y1=b/sz,x2=c/sz,y2=d/sz;
	if(x1!=x2||y1!=y2){
		if(x1==x2&&x1%3==1&&abs(y1-y2)>1){
			ll A=a%sz,C=c%sz;
			cost=min(A+1+C+1,(sz-A)+(sz-C))+abs(b-d);
			return;
		}
		if(y1==y2&&y1%3==1&&abs(x1-x2)>1){
			ll B=b%sz,D=d%sz;
			cost=min(B+1+D+1,(sz-B)+(sz-D))+abs(a-c);
			return;
		}
	}
	if(sz>1)solve(sz/3);
}

int main(){
	rep(i,30)N*=3;
	int q;cin>>q;
	rep(i,q){
		cin>>a>>b>>c>>d;a--;b--;c--;d--;
		cost=abs(a-c)+abs(b-d);
		solve(N/3);
		printf("%lld\n",cost);
	}
}
/*
2
39 24 34 60
*/