#include <bits/stdc++.h>   using namespace std;   const double PI = acos(-1);   const double eps = 1e-9;   const int inf = 2000000000;   const long long infLL = 90000000000000000;   inline bool checkBit(long long n, int i) { return n & (1LL << i); }   inline long long setBit(long long n, int i) {     return n | (1LL << i);     ;   }   inline long long resetBit(long long n, int i) { return n & (~(1LL << i)); }   int dx[] = {0, 0, +1, -1};   int dy[] = {+1, -1, 0, 0};   inline bool EQ(double a, double b) { return fabs(a - b) < 1e-9; }   inline bool isLeapYear(long long year) {     return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);   }   inline void normal(long long &a) {     a %= 1000000007;     (a < 0) && (a += 1000000007);   }   inline long long modMul(long long a, long long b) {     a %= 1000000007, b %= 1000000007;     normal(a), normal(b);     return (a * b) % 1000000007;   }   inline long long modAdd(long long a, long long b) {     a %= 1000000007, b %= 1000000007;     normal(a), normal(b);     return (a + b) % 1000000007;   }   inline long long modSub(long long a, long long b) {     a %= 1000000007, b %= 1000000007;     normal(a), normal(b);     a -= b;     normal(a);     return a;   }   const int MX = 101000;   int tree[21][4 * MX], lazy[21][4 * MX], a[MX];   long long arr[21];   void build(int node, int l, int r, int val) {     if (l == r) {       if (checkBit(a[l], val)) tree[val][node] = 1;       return;     }     int mid = (l + r) / 2;     build(node * 2, l, mid, val);     build(node * 2 + 1, mid + 1, r, val);     tree[val][node] = tree[val][node * 2] + tree[val][node * 2 + 1];     ;   }   void update(int node, int l, int r, int b, int e, int val) {     if (lazy[val][node]) {       tree[val][node] = (r - l + 1) - tree[val][node];       if (l != r) lazy[val][node * 2] ^= 1, lazy[val][node * 2 + 1] ^= 1;       lazy[val][node] = 0;     }     if (l > e || r < b) return;     if (l >= b && r <= e) {       tree[val][node] = (r - l + 1) - tree[val][node];       if (l != r) lazy[val][node * 2] ^= 1, lazy[val][node * 2 + 1] ^= 1;       return;     }     int mid = (l + r) / 2;     update(node * 2, l, mid, b, e, val);     update(node * 2 + 1, mid + 1, r, b, e, val);     tree[val][node] = tree[val][node * 2] + tree[val][node * 2 + 1];   }   int query(int node, int l, int r, int b, int e, int val) {     if (lazy[val][node]) {       tree[val][node] = (r - l + 1) - tree[val][node];       if (l != r) lazy[val][node * 2] ^= 1, lazy[val][node * 2 + 1] ^= 1;       lazy[val][node] = 0;     }     if (l > e || r < b) return 0;     if (l >= b && r <= e) return tree[val][node];     int mid = (l + r) / 2;     return query(node * 2, l, mid, b, e, val) +            query(node * 2 + 1, mid + 1, r, b, e, val);   }   int main() {     for (int i = 1, j = 0; j < 21; ++j, i *= 2) arr[j] = i;     int n;     scanf( %d , &n);     ;     for (int i = 0; i < n; ++i) scanf( %d , &a[i]);     for (int i = 0; i < 21; ++i) build(1, 0, n - 1, i);     int m;     scanf( %d , &m);     ;     while (m--) {       int t;       scanf( %d , &t);       if (t == 1) {         int l, r;         scanf( %d%d , &l, &r);         long long ans = 0LL;         for (int i = 0; i < 21; ++i)           ans += arr[i] * query(1, 0, n - 1, l - 1, r - 1, i);         printf( %lld n , ans);       } else {         int l, r, x;         scanf( %d%d%d , &l, &r, &x);         for (int i = 0; i < 21; ++i)           if (checkBit(x, i)) update(1, 0, n - 1, l - 1, r - 1, i);       }     }     return 0;   }