#include <bits/stdc++.h>
using namespace std;
const int maxint = -1u >> 1;
const double esp = 1e-8;
const int maxn = 100000 + 10;
const int maxdit = 20;
int sgn(const double &x) { return (x > esp) - (x < -esp); }
int n;
int lazy[maxdit + 1][maxn * 4], sum[maxdit + 1][maxn * 4][2];
int two(int x) { return 1 << x; }
void getch(int t, int &lc, int &rc) {
  lc = t << 1;
  rc = (t << 1) | 1;
}
void build(int ty, int t, int l, int r) {
  int lc, rc, mid;
  lazy[ty][t] = 0;
  sum[ty][t][0] = sum[ty][t][1] = 0;
  getch(t, lc, rc);
  mid = (l + r) >> 1;
  if (l == r) return;
  build(ty, lc, l, mid);
  build(ty, rc, mid + 1, r);
}
void pushup(int ty, int t, int lc, int rc) {
  sum[ty][t][1] = sum[ty][lc][1] + sum[ty][rc][1];
  sum[ty][t][0] = sum[ty][lc][0] + sum[ty][rc][0];
}
void pushdown(int ty, int t, int lc, int rc) {
  swap(sum[ty][lc][0], sum[ty][lc][1]);
  swap(sum[ty][rc][0], sum[ty][rc][1]);
  lazy[ty][lc] ^= 1;
  lazy[ty][rc] ^= 1;
  lazy[ty][t] = 0;
}
void add(int ty, int t, int l, int r, int x, int keyty, int key) {
  if (x < l || x > r) return;
  int lc, rc, mid;
  mid = (l + r) >> 1;
  getch(t, lc, rc);
  if (l == r) {
    sum[ty][t][keyty] = key;
    return;
  }
  add(ty, lc, l, mid, x, keyty, key);
  add(ty, rc, mid + 1, r, x, keyty, key);
  pushup(ty, t, lc, rc);
}
void insert(int poc, int x) {
  for (int i = 0; i < (maxdit); ++i) {
    if ((two(i) & x) != 0) {
      add(i, 1, 1, n, poc, 1, 1);
    } else
      add(i, 1, 1, n, poc, 0, 1);
  }
}
void edit(int ty, int t, int l, int r, int x, int y, int v) {
  if (y < l || x > r) return;
  int mid, lc, rc;
  getch(t, lc, rc);
  mid = (l + r) >> 1;
  if (x <= l && r <= y) {
    lazy[ty][t] ^= v;
    swap(sum[ty][t][0], sum[ty][t][1]);
    return;
  }
  if (lazy[ty][t] != 0) {
    pushdown(ty, t, lc, rc);
  }
  edit(ty, lc, l, mid, x, y, v);
  edit(ty, rc, mid + 1, r, x, y, v);
  pushup(ty, t, lc, rc);
}
void change(int l, int r, int x) {
  for (int i = 0; i < (maxdit); ++i) {
    if ((two(i) & x) != 0) {
      edit(i, 1, 1, n, l, r, 1);
    }
  }
}
int find(int ty, int t, int l, int r, int x, int y) {
  if (y < l || x > r) return 0;
  int lc, rc, mid = (l + r) >> 1;
  getch(t, lc, rc);
  if (x <= l && r <= y) {
    return sum[ty][t][1];
  }
  if (lazy[ty][t] != 0) {
    pushdown(ty, t, lc, rc);
  }
  int res = find(ty, lc, l, mid, x, y) + find(ty, rc, mid + 1, r, x, y);
  pushup(ty, t, lc, rc);
  return res;
}
long long get_ans(int l, int r) {
  long long res = 0;
  for (int i = 0; i < (maxdit); ++i) {
    res += (long long)two(i) * find(i, 1, 1, n, l, r);
  }
  return res;
}
int main() {
  while (scanf("%d", &n) == 1) {
    for (int i = 0; i < (maxdit); ++i) build(i, 1, 1, n);
    for (int i = 0; i < (n); ++i) {
      int x;
      scanf("%d", &x);
      insert(i + 1, x);
    }
    int m;
    scanf("%d", &m);
    for (int i = 0; i < (m); ++i) {
      int ty, l, r;
      scanf("%d%d%d", &ty, &l, &r);
      if (ty == 1) {
        printf("%I64d\n", get_ans(l, r));
      } else {
        int x;
        scanf("%d", &x);
        change(l, r, x);
      }
    }
  }
  return 0;
}
