#include <bits/stdc++.h>
using namespace std;
inline void readI(int *i) {
  register int t = 0;
  register char z = getchar();
  while (z < '0' || '9' < z) {
    z = getchar();
  }
  while ('0' <= z && z <= '9') {
    t = (t << 3) + (t << 1) + z - '0';
    z = getchar();
  }
  *i = t;
}
int q, last, l, r, x, t, nr;
unordered_map<int, vector<pair<int, int> > > v;
unordered_map<int, vector<pair<int, int> > >::iterator it;
int odp;
bool znal;
unordered_map<int, int> liczba, odw, rep, roz;
unordered_map<int, bool> syn;
void wypisz_graf() {
  for (it = v.begin(); it != v.end(); ++it) {
    printf("(%d, %d)           ", it->first, liczba[it->first]);
    int l = (it->second).size();
    for (int i = 0; i < l; ++i) {
      printf("(%d, %d) ", ((it->second)[i]).first, ((it->second)[i].second));
    }
    puts("");
  }
}
int find(int x) {
  if (0) {
    printf("FIND x=%d\n", x);
  }
  if (syn[x] == false) {
    return x;
  }
  int pom = rep[x];
  rep[x] = find(rep[x]);
  liczba[x] ^= liczba[pom];
  if (0) {
    printf("x=%d pom=%d liczba[x]=%d liczba[pom]=%d\n", x, pom, liczba[x],
           liczba[pom]);
  }
  return rep[x];
}
void onion(int x, int y) {
  x = find(x);
  y = find(y);
  if (x != y) {
    roz[x] = max(roz[x], 1);
    roz[y] = max(roz[y], 1);
    if (roz[x] > roz[y]) {
      rep[y] = x;
    } else {
      rep[x] = y;
    }
  }
}
void ustaw(int x, int y) {
  odw[x] = nr;
  int l = v[x].size();
  for (int i = 0; i < l; ++i) {
    if (odw[v[x][i].first] != nr && v[x][i].first != y) {
      liczba[v[x][i].first] = (liczba[x] ^ v[x][i].second);
      ustaw(v[x][i].first, y);
    }
  }
}
int main() {
  last = 0;
  readI(&q);
  for (int i = 1; i <= q; ++i) {
    if (0) {
      printf("\ni=%d last=%d -----------------------------\n", i, last);
    }
    readI(&t);
    if (t == 1) {
      readI(&l);
      readI(&r);
      readI(&x);
      l ^= last;
      r ^= last;
      x ^= last;
      if (l > r) {
        swap(l, r);
      }
      if (0) {
        printf("i=%d l=%d r=%d x=%d\n", i, l, r, x);
      }
      ++r;
      ++nr;
      int a = find(l);
      int b = find(r);
      if (0) {
        printf("a=%d b=%d\n", a, b);
      }
      roz[a] = max(roz[a], 1);
      roz[b] = max(roz[b], 1);
      if (roz[a] < roz[b]) {
        swap(a, b);
      }
      if (a != b) {
        int y = (x ^ liczba[l] ^ liczba[r]);
        v[a].emplace_back(make_pair(b, y));
        v[b].emplace_back(make_pair(a, y));
        ++nr;
        liczba[b] = y;
        rep[b] = a;
        syn[b] = true;
      }
    } else if (t == 2) {
      znal = false;
      odp = 0;
      readI(&l);
      readI(&r);
      l ^= last;
      r ^= last;
      if (l > r) {
        swap(l, r);
      }
      if (0) {
        printf("i=%d l=%d r=%d\n", i, l, r);
      }
      ++r;
      int a = find(l);
      int b = find(r);
      if (0) {
        printf("a=%d b=%d\n", a, b);
      }
      if (a != b) {
        odp = -1;
        last = 1;
      } else {
        odp = last = (liczba[l] ^ liczba[r]);
      }
      printf("%d\n", odp);
    }
    if (0) {
      wypisz_graf();
    }
  }
  return 0;
}
