#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 7;
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double PI = acos(-1);
template <class T, class S>
inline void add(T& a, S b) {
  a += b;
  if (a >= mod) a -= mod;
}
template <class T, class S>
inline void sub(T& a, S b) {
  a -= b;
  if (a < 0) a += mod;
}
template <class T, class S>
inline bool chkmax(T& a, S b) {
  return a < b ? a = b, true : false;
}
template <class T, class S>
inline bool chkmin(T& a, S b) {
  return a > b ? a = b, true : false;
}
int q, tot;
map<int, int> Map;
int xorWithFa[N];
int fa[N];
int getRoot(int x) {
  if (x == fa[x]) return x;
  int preFa = fa[x];
  int nowFa = getRoot(fa[x]);
  xorWithFa[x] ^= xorWithFa[preFa];
  return fa[x] = nowFa;
}
int main() {
  for (int i = 1; i < N; i++) fa[i] = i;
  scanf("%d", &q);
  int ans = 0;
  while (q--) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int l, r, x;
      scanf("%d%d%d", &l, &r, &x);
      l ^= ans;
      r ^= ans;
      x ^= ans;
      if (l > r) swap(l, r);
      l--;
      if (Map.find(l) == Map.end()) Map[l] = ++tot;
      if (Map.find(r) == Map.end()) Map[r] = ++tot;
      l = Map[l];
      r = Map[r];
      int fal = getRoot(l);
      int far = getRoot(r);
      if (fal != far) {
        int xor1 = xorWithFa[l];
        int xor2 = xorWithFa[r];
        fa[far] = fal;
        xorWithFa[far] = xor1 ^ xor2 ^ x;
      }
    } else {
      int l, r;
      scanf("%d%d", &l, &r);
      l ^= ans;
      r ^= ans;
      if (l > r) swap(l, r);
      l--;
      if (Map.find(l) == Map.end() || Map.find(r) == Map.end()) {
        puts("-1");
        ans = 1;
      } else {
        l = Map[l];
        r = Map[r];
        int fal = getRoot(l);
        int far = getRoot(r);
        if (fal != far) {
          puts("-1");
          ans = 1;
        } else {
          ans = xorWithFa[l] ^ xorWithFa[r];
          printf("%d\n", ans);
        }
      }
    }
  }
  return 0;
}
