description: Alice gave Bob two integers a and b (a > 0 and b ≥ 0). Being a curious boy, Bob wrote down an array of non-negative integers with \operatorname{MEX} value of all elements equal to a and \operatorname{XOR} value of all elements equal to b.
  
  What is the shortest possible length of the array Bob wrote?
  
  Recall that the \operatorname{MEX} (Minimum EXcluded) of an array is the minimum non-negative integer that does not belong to the array and the \operatorname{XOR} of an array is the [bitwise XOR](https://en.wikipedia.org/wiki/Bitwise_operation#XOR) of all the elements of the array.
  
  Input
  
  The input consists of multiple test cases. The first line contains an integer t (1 ≤ t ≤ 5 ⋅ 10^4) — the number of test cases. The description of the test cases follows.
  
  The only line of each test case contains two integers a and b (1 ≤ a ≤ 3 ⋅ 10^5; 0 ≤ b ≤ 3 ⋅ 10^5) — the \operatorname{MEX} and \operatorname{XOR} of the array, respectively.
  
  Output
  
  For each test case, output one (positive) integer — the length of the shortest array with \operatorname{MEX} a and \operatorname{XOR} b. We can show that such an array always exists.
  
  Example
  
  Input
  
  
  5
  1 1
  2 1
  2 0
  1 10000
  2 10000
  
  
  Output
  
  
  3
  2
  3
  2
  3
  
  Note
  
  In the first test case, one of the shortest arrays with \operatorname{MEX} 1 and \operatorname{XOR} 1 is [0, 2020, 2021].
  
  In the second test case, one of the shortest arrays with \operatorname{MEX} 2 and \operatorname{XOR} 1 is [0, 1].
  
  It can be shown that these arrays are the shortest arrays possible.
solution: #include <bits/stdc++.h>
  using namespace std;
  long long int M = 1e9 + 1;
  long long int MM = 998244353;
  template <typename... T>
  void read(T &...args) {
    ((cin >> args), ...);
  }
  template <typename... T>
  void write(string delimiter, T &&...args) {
    ((cout << args << delimiter), ...);
  }
  long long int gcd(long long int a, long long int b) {
    if (b > a) {
      return gcd(b, a);
    }
    if (b == 0) {
      return a;
    }
    return gcd(b, a % b);
  }
  void swap(long long int &x, long long int &y) {
    long long int temp = x;
    x = y;
    y = temp;
  }
  bool revsort(long long int a, long long int b) { return a > b; }
  void google(long long int t) { cout << "Case #" << t << ": "; }
  void precision(long long int a) { cout << setprecision(a) << fixed; }
  long long int expo(long long int a, long long int b, long long int mod) {
    long long int res = 1;
    while (b > 0) {
      if (b & 1) res = (res * a) % mod;
      a = (a * a) % mod;
      b = b >> 1;
    }
    return res;
  }
  long long int mod_add(long long int a, long long int b, long long int m) {
    a = a % m;
    b = b % m;
    return (((a + b) % m)) % m;
  }
  long long int mod_mul(long long int a, long long int b, long long int m) {
    a = a % m;
    b = b % m;
    return (((a * b) % m)) % m;
  }
  long long int mod_sub(long long int a, long long int b, long long int m) {
    a = a % m;
    b = b % m;
    return (((a - b) % m) + m) % m;
  }
  vector<long long int> v(1000000 + 1);
  void init() {
    v[0] = 0;
    for (int i = 1; i < 1000000 + 1; i++) {
      v[i] = v[i - 1] ^ i;
    }
  }
  void solve() {
    long long int a, b;
    read(a, b);
    long long int ctn = a;
    long long int ans = v[a - 1];
    if (ans == b) {
      cout << ctn << "\n";
      return;
    }
    long long int res = ans ^ a;
    if (res == b) {
      ctn += 2;
    } else {
      ctn++;
    }
    cout << ctn << "\n";
  }
  int main() {
    init();
    int t = 1;
    cin >> t;
    for (long long int i = 1; i <= t; i++) {
      solve();
    }
  }
  