#include <bits/stdc++.h>
int dr[] = {2, 2, -2, -2, 1, -1, 1, -1};
int dc[] = {1, -1, 1, -1, 2, 2, -2, -2};
int dr1[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dc1[] = {1, -1, 1, 0, -1, 0, 1, -1};
int dr2[] = {0, 0, 1, -1};
int dc2[] = {1, -1, 0, 0};
using namespace std;
struct data {
  long long int one, zero, lazy;
  void upd() {
    long long int p = one;
    one = zero;
    zero = p;
  }
};
data tree[21][3 * 100001 + 5];
void build(long long int n, long long int b, long long int e, long long int nod,
           long long int val) {
  if (b == e) {
    for (long long int i = 0; i < 21; i++) {
      long long int p = val & (1 << i);
      if (p > 0)
        tree[i][n].one = 1;
      else
        tree[i][n].zero = 1;
    }
    return;
  }
  long long int mid = (b + e) >> 1, l = n * 2, r = l + 1;
  if (nod <= mid)
    build(l, b, mid, nod, val);
  else
    build(r, mid + 1, e, nod, val);
  for (long long int i = 0; i < 21; i++) {
    tree[i][n].one = tree[i][l].one + tree[i][r].one;
    tree[i][n].zero = tree[i][l].zero + tree[i][r].zero;
  }
}
void update(long long int x, long long int n, long long int b, long long int e,
            long long int b1, long long int e1) {
  if (b > e1 || e < b1) return;
  if (b >= b1 && e <= e1) {
    tree[x][n].lazy++;
    tree[x][n].upd();
    return;
  }
  long long int mid = (b + e) >> 1, l = n * 2, r = l + 1;
  if (tree[x][n].lazy > 0) {
    long long int p = tree[x][n].lazy;
    if (p % 2 == 1) {
      tree[x][l].upd();
      tree[x][r].upd();
    }
    tree[x][l].lazy += p;
    tree[x][r].lazy += p;
    tree[x][n].lazy = 0;
  }
  update(x, l, b, mid, b1, e1);
  update(x, r, mid + 1, e, b1, e1);
  tree[x][n].one = tree[x][l].one + tree[x][r].one;
  tree[x][n].zero = tree[x][l].zero + tree[x][r].zero;
}
long long int query(long long int n, long long int b, long long int e,
                    long long int b1, long long int e1) {
  if (b > e1 || e < b1) return 0;
  if (b >= b1 && e <= e1) {
    long long int s = 0;
    for (long long int i = 0; i < 21; i++) {
      s = s + tree[i][n].one * (1 << i);
    }
    return s;
  }
  long long int mid = (b + e) >> 1, l = n * 2, r = l + 1;
  for (long long int i = 0; i < 21; i++) {
    if (tree[i][n].lazy > 0) {
      long long int p = tree[i][n].lazy;
      if (p % 2 == 1) {
        tree[i][l].upd();
        tree[i][r].upd();
      }
      tree[i][l].lazy += p;
      tree[i][r].lazy += p;
      tree[i][n].lazy = 0;
    }
  }
  long long int p = query(l, b, mid, b1, e1);
  long long int p1 = query(r, mid + 1, e, b1, e1);
  return p + p1;
}
int main() {
  long long int n, i, j;
  scanf("%lld", &n);
  memset(tree, 0, sizeof(tree));
  for (long long int i = 1; i < n + 1; i++) {
    long long int x;
    scanf("%lld", &x);
    build(1, 1, n, i, x);
  }
  long long int m;
  scanf("%lld", &m);
  while (m--) {
    long long int p;
    scanf("%lld", &p);
    if (p == 1) {
      long long int x, y;
      scanf("%lld%lld", &x, &y);
      long long int s = 0;
      s = query(1, 1, n, x, y);
      printf("%lld\n", s);
    } else {
      long long int l, r, x;
      scanf("%lld%lld%lld", &l, &r, &x);
      for (long long int i = 0; i < 21; i++) {
        long long int q = x & (1 << i);
        if (q == 0) continue;
        update(i, 1, 1, n, l, r);
      }
    }
  }
  return 0;
}
