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;
  const long long INF = 1e18;
  long long updiv(long long a, long long b) {
    if (a % b == 0)
      return (a / b);
    else
      return (a / b) + 1;
  }
  long long mymod(long long x, long long m) {
    if (x > 0)
      return x % m;
    else
      return ((x) % (m) + (m)) % (m);
  }
  long long XOR(long long n) {
    if (n % 4 == 0) return n;
    if (n % 4 == 1) return 1;
    if (n % 4 == 2) return n + 1;
    return 0;
  }
  long long G(long long x) {
    long long a = x % 8;
    if (a == 0 || a == 1) return x;
    if (a == 2 || a == 3) return 2;
    if (a == 4 || a == 5) return x + 2;
    if (a == 6 || a == 7) return 0;
    return 0;
  }
  long long countSetBits(long long n) {
    if (n == 0)
      return 0;
    else
      return 1 + countSetBits(n & (n - 1));
  }
  long long spf[10000001];
  void sieve() {
    spf[1] = 1;
    for (long long i = 2; i < 10000001; i++) spf[i] = i;
    for (long long i = 4; i < 10000001; i += 2) spf[i] = 2;
    for (long long i = 3; i * i < 10000001; i++) {
      if (spf[i] == i) {
        for (long long j = i * i; j < 10000001; j += i)
          if (spf[j] == j) spf[j] = i;
      }
    }
  }
  map<long long, long long> mp;
  long long getFactorization(long long x) {
    vector<long long> ret;
    long long ans = 1;
    mp.clear();
    while (x != 1) {
      mp[spf[x]]++;
      x = x / spf[x];
    }
    for (auto P : mp) {
      if (P.second % 2 == 1) ans *= P.first;
    }
    return ans;
  }
  long long power(long long x, long long y) {
    long long res = 1;
    x = x % 1000000007;
    if (x == 0) return 0;
    while (y > 0) {
      if (y & 1) res = (res * x) % 1000000007;
      y = y >> 1;
      x = (x * x) % 1000000007;
    }
    return res;
  }
  long long computeXOR(long long n) {
    if (n % 4 == 0) return n;
    if (n % 4 == 1) return 1;
    if (n % 4 == 2) return n + 1;
    return 0;
  }
  void solve() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    long long a, b;
    cin >> a >> b;
    long long ans = computeXOR(a - 1);
    long long fans;
    if (ans == b) {
      fans = a;
    } else {
      if ((ans ^ b) == a) {
        fans = a + 2;
      } else {
        fans = a + 1;
      }
    }
    cout << fans << '\n';
  }
  int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    long long tc = 1;
    cin >> tc;
    while (tc--) {
      solve();
    }
    return 0;
  }
  