#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <unordered_map>
#include <numeric>
#include <iomanip>
using namespace std;
#define pii pair<long long, long long>
#define ll long long
#define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
const long long dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
const long long dl[2] = {1, -1};
const long long MOD = 1000000007;
const long long MAXN = 500005;
int n, m;
int arr[MAXN];
int seg[MAXN * 4], lazy[MAXN * 4];
void prop(int x, int s, int e){
if(lazy[x] == 0) return;
if((e - s) % 2 == 0) seg[x] ^= lazy[x];
if(s == e){
lazy[x] = 0;
}
else{
lazy[x * 2] ^= lazy[x];
lazy[x * 2 + 1] ^= lazy[x];
lazy[x] = 0;
}
}
void build(int x, int s, int e){
if(s == e){
seg[x] = arr[s];
return;
}
int mid = (s + e) / 2;
build(x * 2, s, mid);
build(x * 2 + 1, mid + 1, e);
seg[x] = seg[x * 2] ^ seg[x * 2 + 1];
}
void update(int x, int s, int e, int a, int b, int k){
prop(x, s, e);
if(b < s || e < a) return;
if(a <= s && e <= b){
lazy[x] ^= k;
prop(x, s, e);
return;
}
int mid = (s + e) / 2;
update(x * 2, s, mid, a, b, k);
update(x * 2 + 1, mid + 1, e, a, b, k);
seg[x] = seg[x * 2] ^ seg[x * 2 + 1];
}
int query(int x, int s, int e, int a, int b){
prop(x, s, e);
if(b < s || e < a) return 0;
if(a <= s and e <= b){
return seg[x];
}
int mid = (s + e) / 2;
return query(x * 2, s, mid, a, b) ^ query(x * 2 + 1, mid + 1, e, a, b);
}
int main() {
FAST;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> arr[i];
}
build(1, 1, n);
cin >> m;
for(int q, i, j, k, l = 0; l < m; l++){
cin >> q >> i >> j;
i++; j++;
if(q == 1){
cin >> k;
update(1, 1, n, i, j, k);
}
else{
cout << query(1, 1, n, i, j) << "\n";
}
}
}