#include <bits/stdc++.h>
using namespace std;
template <class F, class T>
T convert(F a, int p = -1) {
  stringstream ss;
  if (p >= 0) ss << fixed << setprecision(p);
  ss << a;
  T r;
  ss >> r;
  return r;
}
template <class T>
T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <class T>
T sqr(T x) {
  return x * x;
}
template <class T>
T cube(T x) {
  return x * x * x;
}
template <class T>
int getbit(T s, int i) {
  return (s >> i) & 1;
}
template <class T>
T onbit(T s, int i) {
  return s | (T(1) << i);
}
template <class T>
T offbit(T s, int i) {
  return s & (~(T(1) << i));
}
template <class T>
int cntbit(T s) {
  return s == 0 ? 0 : cntbit(s >> 1) + (s & 1);
}
const int bfsz = 1 << 16;
char bf[bfsz + 5];
int rsz = 0;
int ptr = 0;
char gc() {
  if (rsz <= 0) {
    ptr = 0;
    rsz = (int)fread(bf, 1, bfsz, stdin);
    if (rsz <= 0) return EOF;
  }
  --rsz;
  return bf[ptr++];
}
void ga(char &c) {
  c = EOF;
  while (!isalpha(c)) c = gc();
}
int gs(char s[]) {
  int l = 0;
  char c = gc();
  while (isspace(c)) c = gc();
  while (c != EOF && !isspace(c)) {
    s[l++] = c;
    c = gc();
  }
  s[l] = '\0';
  return l;
}
template <class T>
bool gi(T &v) {
  v = 0;
  char c = gc();
  while (c != EOF && c != '-' && !isdigit(c)) c = gc();
  if (c == EOF) return false;
  bool neg = c == '-';
  if (neg) c = gc();
  while (isdigit(c)) {
    v = v * 10 + c - '0';
    c = gc();
  }
  if (neg) v = -v;
  return true;
}
const long double PI = acos(-1.0);
const long double eps = 1e-9;
const int dr[] = {0, 0, -1, +1, -1, -1, +1, +1};
const int dc[] = {-1, +1, 0, 0, -1, +1, -1, +1};
const int inf = (int)1e9 + 5;
const long long linf = (long long)1e16 + 5;
const long long mod = (long long)1e9 + 7;
const int maxn = 100 + 5;
int a[600005], f[24][600005], d[24][600005], q, n;
void init(int id, int l, int r, int num) {
  if (l == r) {
    f[num][id] = getbit(a[l], num);
    return;
  }
  int mid = (l + r) >> 1;
  init(id + id, l, mid, num);
  init(id + id + 1, mid + 1, r, num);
  f[num][id] = f[num][id + id] + f[num][id + id + 1];
}
int get(int id, int l, int r, int u, int v, int num) {
  if (r < u || l > v) return 0;
  if (u <= l && v >= r) {
    if (d[num][id])
      return (r - l + 1) - f[num][id];
    else
      return f[num][id];
  }
  int mid = (l + r) >> 1;
  if (d[num][id]) {
    d[num][id] = 0;
    f[num][id] = (r - l + 1) - f[num][id];
    d[num][id + id] = 1 - d[num][id + id];
    d[num][id + id + 1] = 1 - d[num][id + id + 1];
  }
  return get(id + id, l, mid, u, v, num) +
         get(id + id + 1, mid + 1, r, u, v, num);
  f[num][id] = (d[num][id + id] == 0 ? f[num][id + id]
                                     : (mid - l + 1) - f[num][id + id]) +
               (d[num][id + id + 1] == 0 ? f[num][id + id + 1]
                                         : (r - mid) - f[num][id + id + 1]);
}
void update(int id, int l, int r, int u, int v, int num) {
  if (r < u || l > v) return;
  if (u <= l && v >= r) {
    d[num][id] = 1 - d[num][id];
    if (d[num][id]) {
      d[num][id] = 0;
      f[num][id] = (r - l + 1) - f[num][id];
      d[num][id + id] = 1 - d[num][id + id];
      d[num][id + id + 1] = 1 - d[num][id + id + 1];
    }
    return;
  }
  int mid = (l + r) >> 1;
  if (d[num][id]) {
    d[num][id] = 0;
    f[num][id] = (r - l + 1) - f[num][id];
    d[num][id + id] = 1 - d[num][id + id];
    d[num][id + id + 1] = 1 - d[num][id + id + 1];
  }
  update(id + id, l, mid, u, v, num);
  update(id + id + 1, mid + 1, r, u, v, num);
  f[num][id] = (d[num][id + id] == 0 ? f[num][id + id]
                                     : (mid - l + 1) - f[num][id + id]) +
               (d[num][id + id + 1] == 0 ? f[num][id + id + 1]
                                         : (r - mid) - f[num][id + id + 1]);
}
int main() {
  scanf("%d", &n);
  for (int i = (1); i <= (n); ++i) scanf("%d", &a[i]);
  memset(f, 0, sizeof(f));
  memset(d, 0, sizeof(d));
  for (int i = 0; i < (23); ++i) init(1, 1, n, i);
  scanf("%d", &q);
  for (int run = 0; run < (q); ++run) {
    int hoi, u, v, x;
    long long res = 0;
    scanf("%d %d %d", &hoi, &u, &v);
    if (hoi == 1) {
      for (int i = 0; i < (23); ++i) res += get(1, 1, n, u, v, i) * (1ll << i);
      cout << res << endl;
    } else {
      scanf("%d", &x);
      for (int i = 0; i < (23); ++i)
        if (getbit(x, i)) update(1, 1, n, u, v, i);
    }
  }
  return 0;
}
