#include <iostream>
#include<vector>
using namespace std;
bool check(int n,long long a,long long b){
    long long total=(long long)n*n;
    long long max=(total+1)/2;
    long long min=(total)/2;
    if((a<=max&&b<=min)||(a<=min&&b<=max)){
        return true;
    }else{
        return false;
    }
}
int main(){
    int T;  // 测试用例数量
    cin>>T;  // 读取测试用例数量
    
    // 创建二维向量存储每个测试用例的两个整数
    vector<vector<int>>arr(T,vector<int>(2));
    
    // 读取每个测试用例的两个整数
    for(int i=0;i<T;i++){
        cin>>arr[i][0]>>arr[i][1];
    }
    
    // 处理每个测试用例
    for(int i=0;i<T;i++){
        long long a=arr[i][0];  // 第一个参数
        long long b=arr[i][1];  // 第二个参数
        
        // 二分查找的左右边界
        long long left=1,right=200000;
        long long answer=200000;  // 初始化答案为右边界
        
        // 二分查找过程
        while(left<=right){
            long long mid=(left+right)/2;  // 计算中间值
            
            // 检查mid是否满足条件
            if(check(mid,a,b)){
                answer=mid;  // 更新答案
                right=mid-1;  // 尝试寻找更小的满足条件的值
            }else{
                left=mid+1;  // 增大mid值继续寻找
            }
        }
        
        // 输出每个测试用例的答案
        cout<<answer<<endl;
    }
    return 0;
}