#include <bits/stdc++.h>
using namespace std;
char READ_DATA;
int SIGNAL_INPUT;
template <typename Type>
inline char ru(Type &v) {
  SIGNAL_INPUT = 1;
  while ((READ_DATA = getchar()) < '0' || READ_DATA > '9')
    if (READ_DATA == '-')
      SIGNAL_INPUT = -1;
    else if (READ_DATA == EOF)
      return EOF;
  v = READ_DATA - '0';
  while ((READ_DATA = getchar()) >= '0' && READ_DATA <= '9')
    v = v * 10 + READ_DATA - '0';
  v *= SIGNAL_INPUT;
  return 1;
}
template <typename A, typename B>
inline char ru(A &x, B &y) {
  if (ru(x) == EOF) return EOF;
  ru(y);
  return 2;
}
template <typename A, typename B, typename C>
inline char ru(A &x, B &y, C &z) {
  if (ru(x) == EOF) return EOF;
  ru(y);
  ru(z);
  return 3;
}
template <typename A, typename B, typename C, typename D>
inline char ru(A &x, B &y, C &z, D &w) {
  if (ru(x) == EOF) return EOF;
  ru(y);
  ru(z);
  ru(w);
  return 4;
}
struct Edge {
  int v, next;
  Edge(int _v = 0, int nxt = -1) {
    v = _v;
    next = nxt;
  }
};
const int mod = 1e9 + 7;
const int maxn = 1e5 + 2;
struct BIT {
  int n;
  long long t[maxn];
  void add(int x, long long d) {
    while (x <= n) {
      t[x] += d;
      x += (x & -x);
    }
  }
  long long sum(int x) {
    long long ans = 0;
    while (x) {
      ans += t[x];
      x -= (x & -x);
    }
    return ans;
  }
};
int n, m, ql, qr, bit, f[maxn * 4][20];
long long t[maxn * 4][20];
long long val(int k, int l, int r) {
  if (f[k][bit]) return r - l + 1 - t[k][bit];
  return t[k][bit];
}
void pd(int k) {
  if (f[k][bit]) {
    f[(k << 1)][bit] ^= f[k][bit];
    f[(k << 1 | 1)][bit] ^= f[k][bit];
    f[k][bit] = 0;
  }
}
void mt(int k, int l, int r) {
  int mid = l + r >> 1;
  ;
  t[k][bit] = val((k << 1), l, mid) + val((k << 1 | 1), mid + 1, r);
}
void add(int k, int l, int r) {
  if ((ql <= l && r <= qr))
    ++t[k][bit];
  else {
    int mid = l + r >> 1;
    ;
    if (ql <= mid)
      add((k << 1), l, mid);
    else
      add((k << 1 | 1), mid + 1, r);
    mt(k, l, r);
  }
}
void flip(int k, int l, int r) {
  if ((ql <= l && r <= qr)) {
    f[k][bit] ^= 1;
  } else {
    pd(k);
    int mid = l + r >> 1;
    ;
    if (ql <= mid) flip((k << 1), l, mid);
    if (qr > mid) flip((k << 1 | 1), mid + 1, r);
    mt(k, l, r);
  }
}
long long qry(int k, int l, int r) {
  if ((ql <= l && r <= qr)) {
    if (f[k][bit]) return r - l + 1 - t[k][bit];
    return t[k][bit];
  }
  pd(k);
  long long cnt = 0;
  int mid = l + r >> 1;
  ;
  if (ql <= mid) cnt += qry((k << 1), l, mid);
  if (qr > mid) cnt += qry((k << 1 | 1), mid + 1, r);
  mt(k, l, r);
  return cnt;
}
int main() {
  ru(n);
  int x;
  for (int i = 1; i <= n; ++i) {
    ru(x);
    bit = 0;
    ql = qr = i;
    while (x) {
      if (x & 1) add(1, 1, n);
      x >>= 1;
      ++bit;
    }
  }
  ru(m);
  int t;
  long long sum;
  while (m--) {
    ru(t, ql, qr);
    if (t == 1) {
      sum = 0;
      for (bit = 0; bit < 20; ++bit) sum += (1LL << bit) * qry(1, 1, n);
      cout << sum << endl;
    } else {
      ru(x);
      bit = 0;
      while (x) {
        if (x & 1) flip(1, 1, n);
        x >>= 1;
        ++bit;
      }
    }
  }
}
