#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 1;
int q;
int last;
map<int, int> Xor, par;
int finds(int x) {
  if (par[x] == 0) {
    return x;
  }
  int past = par[x];
  par[x] = finds(par[x]);
  Xor[x] ^= Xor[past];
  return par[x];
}
inline void Dsu(int v, int u, int t) {
  int x = finds(v);
  int y = finds(u);
  if (x == y) {
    return;
  }
  par[x] = y;
  Xor[x] = t ^ Xor[u] ^ Xor[v];
  return;
}
inline int jav(int v, int u) {
  int x = finds(v);
  int y = finds(u);
  if (x != y) {
    return -1;
  }
  return Xor[v] ^ Xor[u];
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> q;
  for (int i = 1; i <= q; i++) {
    int tmp1;
    cin >> tmp1;
    if (tmp1 == 1) {
      int tmp2, tmp3, tmp4;
      cin >> tmp2 >> tmp3 >> tmp4;
      tmp2 ^= last;
      tmp3 ^= last;
      tmp4 ^= last;
      if (tmp3 < tmp2) {
        swap(tmp2, tmp3);
      }
      tmp3++;
      Dsu(tmp2, tmp3, tmp4);
    } else {
      int tmp2, tmp3;
      cin >> tmp2 >> tmp3;
      tmp2 ^= last;
      tmp3 ^= last;
      if (tmp2 > tmp3) {
        swap(tmp2, tmp3);
      }
      tmp3++;
      int ans = jav(tmp2, tmp3);
      last = abs(ans);
      cout << ans << "\n";
    }
  }
  return 0;
}
