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 Rust (1.15.1) (judge verdict: Accepted)

fn read_stdin() -> String {
    use std::io::Read;
    let mut input = String::new();
    std::io::stdin().read_to_string(&mut input).unwrap();
    input
}

fn scan<'a, I: Iterator<Item = &'a str>, T: std::str::FromStr>(tokens: &mut I) -> T {
    tokens.next().unwrap().parse().ok().unwrap()
}

fn main() {
    let input = read_stdin();
    let tokens = &mut input.split_whitespace();
    let q: usize = scan(tokens);
    for _ in 0..q {
        let a: usize = scan(tokens);
        let b: usize = scan(tokens);
        let c: usize = scan(tokens);
        let d: usize = scan(tokens);
        let (a, b, c, d) = (a - 1, b - 1, c - 1, d - 1);
        let mut loss = 0;
        let mut u = 1;
        for _ in 0..30 {
            loss = std::cmp::max(loss, f(a, b, c, d, u));
            loss = std::cmp::max(loss, f(c, d, a, b, u));
            loss = std::cmp::max(loss, f(b, a, d, c, u));
            loss = std::cmp::max(loss, f(d, c, b, a, u));
            u *= 3;
        }
        println!("{}", diff(a, c) + diff(b, d) + 2 * loss);
    }
}

fn f(a: usize, b: usize, c: usize, d: usize, u: usize) -> usize {
    if (a / u + 2) / 3 < (c / u + 1) / 3 && b / u == d / u && b / u % 3 == 1 {
        let mut loss = u;
        loss = std::cmp::min(loss, b % u + 1);
        loss = std::cmp::min(loss, d % u + 1);
        loss = std::cmp::min(loss, u - b % u);
        loss = std::cmp::min(loss, u - d % u);
        loss
    } else {
        0
    }
}

fn diff(x: usize, y: usize) -> usize {
    if x < y {
        y - x
    } else {
        x - y
    }
}