#include <fstream>
#include <iostream>
#include <functional>
#include <algorithm>
#include <sstream>
#include <cstring>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <deque>
#include <ctime>
#include <list>
#include <set>
#include <map>
#include <bitset>
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define EPS 1e-8
#define LL_INF 0x3fffffffffffffff
#define INF 0x3f3f3f3f3f3f3f3f
#define MEM(a, b) memset(a, b, sizeof(a))
#define PPER(i, n, m) for (int i = n; i >= m; i--)
#define REPP(i, n, m) for (int i = n; i <= m; i++)
#define REP(i, n, m) for (int i = n; i < m; i++)
#define PER(i, n, m) for (int i = n; i > m; i--)
#define SA(n) scanf("%d", &(n))
#define SLLA(n) scanf("%lld", &(n))
#define MP make_pair
#define FF first
#define SS second
#define PB push_back
#define DE(val) cout << #val << ": " << val << endl;

const int dx44[6] = {0, -1, -1, 1, 1};
const int dy44[6] = {0, -1, 1, -1, 1};
const int dx4[6] = {0, 1, 0,-1};
const int dy4[6] = {-1, 0, 1,0};
const int dx8[9] = {0, -1, 0, 1, 0, 1, 1, -1, -1};
const int dy8[9] = {0, 0, 1, 0, -1, 1, -1, 1, -1};
const int dx82[9] = {0, -1, -1, 1, 1, 2, 2, -2, -2};
const int dy82[9] = {0, 2, -2, 2, -2, 1, -1, 1, -1};
void update(ll& x,ll v){
    if(x==-1)x=v;
    else if(x>v)x=v;
}

ll po(ll a, ll b, ll mod)
{
    ll res = 1;
    a %= mod;
    for (; b; b >>= 1)
    {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod;
    }
    return res;
}
ll gcd(ll a, ll b)
{
    if (a == 0)
    {
        return b;
    }
    else
    {
        return gcd(b % a, a);
    }
}
void extgcd(ll a, ll b, ll &d, ll &x, ll &y)
{
    if (!b)
    {
        d = a;
        x = 1;
    }
    else
    {
        extgcd(b, a % b, d, y, x);
        y -= x * (a / b);
    }
}
ll inverse(ll a, ll n)
{
    ll d, x, y;
    extgcd(a, n, d, x, y);
    return d == 1 ? (x + n) % n : -1;
}
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
const int maxn = 1e5 + 5;
const double PI = acos(-1.0);
const ll mod = 1000000007;
/*************************************************************************/

ll wid[maxn];
ll dfs(ll x1, ll y1, ll x2, ll y2, int level) {
    if (level == 0) {
        return abs(y1 - y2);
    }
    ll w = wid[level-1];
    if(x1 / w != x2 / w) {
        return abs(x1 - x2) + abs(y1 - y2);
    }
    if(x1 / w == 1 && abs(y1 / w - y2 /w) >= 2) {
        return abs( y1 - y2 )  + min(x1 % w + 1 + x2 % w + 1, w - x1%w + w - x2%w);
    }
    return dfs(x1 % w, y1, x2 % w, y2, level-1);
}

int q;
void solve() {
    wid[0] = 1;
    REPP(i,1,30) {
        wid[i] = wid[i-1] * 3;
     }
    SA(q);
    REPP(i,1,q) {
        ll a1,b1,c1,d1;
        SLLA(a1);
        SLLA(b1);
        SLLA(c1);
        SLLA(d1);
        a1--;
        b1--;
        c1--;
        d1--;
        if(abs(a1 - c1) > abs(b1 - d1)) {
            swap(b1, a1);
            swap(c1, d1);
        }

        cout<< dfs(a1, b1, c1, d1, 30) <<endl;
    }
}


int main()
{
// #ifndef ONLINE_JUDGE
//   freopen("i.txt", "r", stdin);
//   freopen("o.txt", "w", stdout);
// #endif
  solve();
  return 0;
}





Measured memory_bytes: 384