#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const double eps = 1e-9;
const int inf = 2000000000;
const long long infLL = 90000000000000000;
inline bool checkBit(long long n, int i) { return n & (1LL << i); }
inline long long setBit(long long n, int i) {
  return n | (1LL << i);
  ;
}
inline long long resetBit(long long n, int i) { return n & (~(1LL << i)); }
int dx[] = {0, 0, +1, -1};
int dy[] = {+1, -1, 0, 0};
inline bool EQ(double a, double b) { return fabs(a - b) < 1e-9; }
inline bool isLeapYear(long long year) {
  return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
inline void normal(long long &a) {
  a %= 1000000007;
  (a < 0) && (a += 1000000007);
}
inline long long modMul(long long a, long long b) {
  a %= 1000000007, b %= 1000000007;
  normal(a), normal(b);
  return (a * b) % 1000000007;
}
inline long long modAdd(long long a, long long b) {
  a %= 1000000007, b %= 1000000007;
  normal(a), normal(b);
  return (a + b) % 1000000007;
}
inline long long modSub(long long a, long long b) {
  a %= 1000000007, b %= 1000000007;
  normal(a), normal(b);
  a -= b;
  normal(a);
  return a;
}
const int MX = 101000;
int tree[21][4 * MX], lazy[21][4 * MX], a[MX];
long long arr[21];
void build(int node, int l, int r, int val) {
  if (l == r) {
    if (checkBit(a[l], val)) tree[val][node] = 1;
    return;
  }
  int mid = (l + r) / 2;
  build(node * 2, l, mid, val);
  build(node * 2 + 1, mid + 1, r, val);
  tree[val][node] = tree[val][node * 2] + tree[val][node * 2 + 1];
  ;
}
void update(int node, int l, int r, int b, int e, int val) {
  if (lazy[val][node]) {
    tree[val][node] = (r - l + 1) - tree[val][node];
    if (l != r) lazy[val][node * 2] ^= 1, lazy[val][node * 2 + 1] ^= 1;
    lazy[val][node] = 0;
  }
  if (l > e || r < b) return;
  if (l >= b && r <= e) {
    tree[val][node] = (r - l + 1) - tree[val][node];
    if (l != r) lazy[val][node * 2] ^= 1, lazy[val][node * 2 + 1] ^= 1;
    return;
  }
  int mid = (l + r) / 2;
  update(node * 2, l, mid, b, e, val);
  update(node * 2 + 1, mid + 1, r, b, e, val);
  tree[val][node] = tree[val][node * 2] + tree[val][node * 2 + 1];
}
int query(int node, int l, int r, int b, int e, int val) {
  if (lazy[val][node]) {
    tree[val][node] = (r - l + 1) - tree[val][node];
    if (l != r) lazy[val][node * 2] ^= 1, lazy[val][node * 2 + 1] ^= 1;
    lazy[val][node] = 0;
  }
  if (l > e || r < b) return 0;
  if (l >= b && r <= e) return tree[val][node];
  int mid = (l + r) / 2;
  return query(node * 2, l, mid, b, e, val) +
         query(node * 2 + 1, mid + 1, r, b, e, val);
}
int main() {
  for (int i = 1, j = 0; j < 21; ++j, i *= 2) arr[j] = i;
  int n;
  scanf("%d", &n);
  ;
  for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
  for (int i = 0; i < 21; ++i) build(1, 0, n - 1, i);
  int m;
  scanf("%d", &m);
  ;
  while (m--) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      int l, r;
      scanf("%d%d", &l, &r);
      long long ans = 0LL;
      for (int i = 0; i < 21; ++i)
        ans += arr[i] * query(1, 0, n - 1, l - 1, r - 1, i);
      printf("%lld\n", ans);
    } else {
      int l, r, x;
      scanf("%d%d%d", &l, &r, &x);
      for (int i = 0; i < 21; ++i)
        if (checkBit(x, i)) update(1, 0, n - 1, l - 1, r - 1, i);
    }
  }
  return 0;
}
