#include <bits/stdc++.h>
using namespace std;
template <class T>
void max_swap(T& a, const T& b) {
  a = max(a, b);
}
template <class T>
void min_swap(T& a, const T& b) {
  a = min(a, b);
}
template <class T>
void uniq(vector<T>& c) {
  sort(c.begin(), c.end());
  c.erase(unique(c.begin(), c.end()), c.end());
}
template <class T>
string to_s(const T& a) {
  ostringstream os;
  os << a;
  return os.str();
}
template <class T>
T to_T(const string& s) {
  istringstream is(s);
  T res;
  is >> res;
  return res;
}
template <class T, class U>
ostream& operator<<(ostream& os, pair<T, U>& p) {
  os << "( " << p.first << ", " << p.second << " )";
  return os;
}
template <class T>
void print(T a, int n, const string& deli = " ", int br = 1) {
  for (int i = 0; i < n; ++i) {
    cout << a[i];
    if (i + 1 != n) cout << deli;
  }
  while (br--) cout << endl;
}
template <class T>
void print(const T& c, const string& deli = " ", int br = 1) {
  for (__typeof__((c).begin()) it = (c).begin(); it != (c).end(); ++it) {
    cout << *it;
    if (++it != c.end()) cout << deli;
    --it;
  }
  while (br--) cout << endl;
}
template <class T>
void print2d(T a, int w, int h, int width = -1, int br = 1) {
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (width != -1) cout.width(width);
      cout << a[i][j] << ' ';
    }
    cout << endl;
  }
  while (br--) cout << endl;
}
template <class T>
void input(T& a, int n) {
  for (int i = 0; i < n; ++i) cin >> a[i];
}
template <class T>
void input(T* a, int n) {
  for (int i = 0; i < n; ++i) cin >> a[i];
}
void fast_io() {
  cin.tie(0);
  ios::sync_with_stdio(false);
}
bool valid(int x, int y, int w, int h) {
  return 0 <= x && x < w && 0 <= y && y < h;
}
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
const double PI = acos(-1.0);
const int mod = ((long long)(1e9)) + 7;
class SegTree {
 private:
  int size;
  vector<int> one;
  vector<bool> flipped;
  void flip(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return;
    if (a <= l && r <= b) {
      flipped[k] = !flipped[k];
      one[k] = (r - l) - one[k];
    } else {
      int mid = (l + r) / 2;
      flip(a, b, 2 * k + 1, l, mid);
      flip(a, b, 2 * k + 2, mid, r);
      int res = one[2 * k + 1] + one[2 * k + 2];
      if (flipped[k]) res = (r - l) - res;
      one[k] = res;
    }
  }
  int count(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return 0;
    if (a <= l && r <= b)
      return one[k];
    else {
      int mid = (l + r) / 2;
      int res = count(a, b, 2 * k + 1, l, mid) + count(a, b, 2 * k + 2, mid, r);
      if (flipped[k]) res = (min(b, r) - max(a, l)) - res;
      return res;
    }
  }

 public:
  void init(int n) {
    size = 1;
    while (size < n) size *= 2;
    flipped.resize(2 * size);
    one.resize(2 * size);
    for (int i = 0; i < 2 * size; ++i) {
      flipped[i] = false;
      one[i] = 0;
    }
  }
  void flip(int a, int b) { flip(a, b, 0, 0, size); }
  int count(int a, int b) { return count(a, b, 0, 0, size); }
};
int main() {
  int n;
  scanf("%d", &n);
  SegTree tree[20];
  for (int i = 0; i < 20; ++i) tree[i].init(n);
  for (int i = 0; i < (int)(n); ++i) {
    int a;
    scanf("%d", &a);
    for (int j = 0; j < 20; ++j)
      if (a >> j & 1) tree[j].flip(i, i + 1);
  }
  int m;
  scanf("%d", &m);
  while (m--) {
    int t, l, r;
    scanf("%d%d%d", &t, &l, &r);
    --l;
    if (t == 1) {
      long long sum = 0;
      for (int i = 0; i < 20; ++i) sum += (1LL << (i)) * tree[i].count(l, r);
      printf("%I64d\n", sum);
    } else {
      int x;
      scanf("%d", &x);
      for (int i = 0; i < 20; ++i)
        if (x >> i & 1) tree[i].flip(l, r);
    }
  }
}
