//isaf27

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <vector>
#include <queue>
#include <bitset>
#include <cmath>
#include <time.h>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <stdlib.h>
#include <deque>
#include <iomanip>
#include <complex>
#include <ctime>
#include <bits/stdc++.h>
//#include <ext/rope>

using namespace std;
//using namespace __gnu_cxx;

//defines
typedef long long ll;
typedef long double ld;
#define TIME clock() * 1.0 / CLOCKS_PER_SEC
#define fast_read cin.sync_with_stdio(0)
#define PREX(number) cout << fixed << setprecision(number)
#define nul point(0, 0)
#define random srand(time(NULL))
#define rand_int abs((rand() << 15) | rand())
#define str_to_int(stroka) atoi(stroka.c_str())
#define str_to_ll(stroka) atoll(stroka.c_str())
#define str_to_double(stroka) atof(stroka.c_str())
#define what_is(x) cerr << #x << " is " << x << endl
#define solve_system int number; cin >> number; for (int i = 0; i < number; i++) solve()
#define solve_system_scanf int number; scanf("%d", &number); forn(i, 0, number) solve()

//easy functions
template< typename T >
T gcd(T a, T b) { return a ? gcd(b % a, a) : b; }
template< typename T >
T lcm(T a, T b) { return (a / gcd(a, b)) * b; }
bool is_down(char x) { return ('a' <= x && x <= 'z'); }
bool is_upper(char x) { return ('A' <= x && x <= 'Z'); }
bool is_digit(char x) { return ('0' <= x && x <= '9'); }

//constants
const ld pi = 3.141592653589793238462643383279;
const ld log23 = 1.58496250072115618145373894394781;
const ld eps = 1e-10;
const ld zero = 0;
const ll INF = 1e18;
const int COUT = 30;
const int prost = 239;
const ll prost64 = 239;
const int two = 2;
const int thr = 3;
const ll sr = 31;
const ll MOD = 1e9 + 7;
const ll MOD2 = MOD * MOD;
const int BIG = 1e9 + 239;
const int alf = 26;
const int M = 2 * 1e5 + 239;
const int N = 2 * 1e3 + 239;
const int T = (1 << 20);
const int B = trunc(sqrt(M)) + 1;
const int MAX_LOG = 19;
const int km = (1 << 18);
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const int dxo[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
const int dyo[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
const int bit_max = 32;
const int dig = 10;
const string str_alf = "abcdefghijklmnopqrstuvwxyz";
const string str_alf_big = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const int day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int digarr[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
const int bt = 31;
const int X = 211;

// Code starts here

bool can(ll x, ll _a, ll _b)
{
    set<pair<ll, ll> > v1, v2;
    if (x < _a)
        v1.insert(make_pair(1, x));
    else
    {
        if (_a != 1)
            v1.insert(make_pair(1, _a - 1));
        v1.insert(make_pair(_a + 1, x + 1));
    }
    if (x < _b)
        v2.insert(make_pair(-1, -x));
    else
    {
        if (_b != 1)
            v2.insert(make_pair(-1, -_b + 1));
        v2.insert(make_pair(-_b - 1, -x - 1));
    }
    vector<tuple<ll, ll, ll> > q;
    while (!v1.empty() && !v2.empty())
    {
        pair<ll, ll> t1 = *v1.begin();
        v1.erase(v1.begin());
        pair<ll, ll> t2 = *v2.begin();
        v2.erase(v2.begin());
        t2.first = -t2.first;
        t2.second = -t2.second;
        if (t1.second - t1.first == t2.second - t2.first)
            q.push_back(make_tuple(t1.first, t2.first, t2.second - t2.first + 1));
        else
        {
            if (t1.second - t1.first < t2.second - t2.first)
            {
                ll len = t1.second - t1.first + 1;
                q.push_back(make_tuple(t1.first, t2.second - len + 1, len));
                v2.insert(make_pair(-t2.first, -t2.second + len));
            }
            else
            {
                ll len = t2.second - t2.first + 1;
                q.push_back(make_tuple(t1.first, t2.first, len));
                v1.insert(make_pair(t1.first + len, t1.second));
            }
        }
    }
    for (tuple<ll, ll, ll> t : q)
    {
        ll a = get<0>(t);
        ll b = get<1>(t);
        ll l = get<2>(t);
        ll mx = 0;
        mx = max(mx, a * (b + l - 1));
        mx = max(mx, b * (a + l - 1));
        b += l - 1;
        ll r = ((b - a) / 2);
        if (r >= 0 && r < l)
            mx = max(mx, (a + r) * (b - r));
        r = ((b - a) / 2) + 1;
        if (r >= 0 && r < l)
            mx = max(mx, (a + r) * (b - r));
        r = ((b - a) / 2) - 1;
        if (r >= 0 && r < l)
            mx = max(mx, (a + r) * (b - r));
        if (mx >= _a * _b)
            return false;
    }
    return true;
}

void solve()
{
    ll a, b;
    cin >> a >> b;
    ll l = 0;
    ll r = max(a, b) * 2LL + 1;
    while (r - l > 1)
    {
        ll h = (l + r) >> 1;
        if (can(h, a, b))
            l = h;
        else
            r = h;
    }
    cout << l << "\n";
}

int main()
{   /*
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif /**/
    fast_read;
    int T;
    cin >> T;
    for (int z = 0; z < T; z++)
        solve();
    return 0;
}


Measured memory_bytes: 256