#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
// Ta có thể xử lí độc lập theo từng bit
// ***Đối với truy vấn get***:
// Xét đoạn [l, r] bất kì, giả sử ta cần tính a[l] + a[l + 1] + a[l + 2] + ... + a[r]
// thì giá trị mà bit thứ k đóng góp vào trong đáp án sẽ là 2^k * cnt(k, l, r)
// với cnt(k, l, r) là số lượng phần tử trong đoạn [l, r] sao cho bit thứ k của nó = 1
// ***Đối với truy vấn update***:
// Xét đoạn [l, r] bất kì, giả sử ta cần xor mỗi phần tử với x
// Ta chỉ cần xét những bit 1 của x (những bit bằng 0 không làm ảnh hưởng đến giá trị của đoạn [l, r])
// Giả sử bit thứ k của x bằng 1:
// - Đối với những phần tử thuộc [l, r] sao cho bit thứ k = 0, thì bit thứ k của chúng sẽ bị thay đổi thành 1
// - Đối với những phần tử thuộc [l, r] sao cho bit thứ k = 1, thì bit thứ k của chúng sẽ bị thay đổi thành 0
// Nên từ đây ta có 20 cây Segment Tree, tree[k] sẽ quản lí những vị trí i sao cho bit thứ k của a[i] bằng 1
const int N = 1e5 + 5;
int n, q;
int a[N];
struct SegTree {
int n;
vector<int> seg, lazy;
SegTree() {}
SegTree(int n): n(n) {
seg.resize(4 * n + 1, 0);
lazy.resize(4 * n + 1, 0);
}
void push(int id, int l, int r) {
if (lazy[id] == 1) {
int mid = (l + r) >> 1;
seg[id * 2] = (mid - l + 1) - seg[id * 2];
lazy[id * 2] ^= lazy[id];
seg[id * 2 + 1] = (r - mid) - seg[id * 2 + 1];
lazy[id * 2 + 1] ^= lazy[id];
lazy[id] = 0;
}
}
void update(int id, int l, int r, int u, int v) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
seg[id] = (r - l + 1) - seg[id];
lazy[id] ^= 1;
return;
}
push(id, l, r);
int mid = (l + r) >> 1;
update(id * 2, l, mid, u, v);
update(id * 2 + 1, mid + 1, r, u, v);
seg[id] = seg[id * 2] + seg[id * 2 + 1];
}
int get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) return seg[id];
push(id, l, r);
int mid = (l + r) >> 1;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
};
SegTree tree[20];
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int k = 0; k <= 19; k++) {
tree[k] = SegTree(n);
for (int i = 1; i <= n; i++) {
if ((a[i] >> k) & 1) tree[k].update(1, 1, n, i, i);
}
}
cin >> q;
while (q--) {
int type, l, r;
cin >> type >> l >> r;
if (type == 2) {
int x; cin >> x;
for (int k = 0; k <= 19; k++) {
if ((x >> k) & 1) tree[k].update(1, 1, n, l, r);
}
}
else {
ll ans = 0;
for (int k = 0; k <= 19; k++) {
ans += (1ll << k) * tree[k].get(1, 1, n, l, r);
}
cout << ans << '\n';
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgovLyBUYSBjw7MgdGjhu4MgeOG7rSBsw60gxJHhu5ljIGzhuq1wIHRoZW8gdOG7q25nIGJpdAoKLy8gKioqxJDhu5FpIHbhu5tpIHRydXkgduG6pW4gZ2V0KioqOiAKLy8gWMOpdCDEkW/huqFuIFtsLCByXSBi4bqldCBrw6wsIGdp4bqjIHPhu60gdGEgY+G6p24gdMOtbmggYVtsXSArIGFbbCArIDFdICsgYVtsICsgMl0gKyAuLi4gKyBhW3JdIAovLyB0aMOsIGdpw6EgdHLhu4sgbcOgIGJpdCB0aOG7qSBrIMSRw7NuZyBnw7NwIHbDoG8gdHJvbmcgxJHDoXAgw6FuIHPhur0gbMOgIDJeayAqIGNudChrLCBsLCByKSAKLy8gduG7m2kgY250KGssIGwsIHIpIGzDoCBz4buRIGzGsOG7o25nIHBo4bqnbiB04butIHRyb25nIMSRb+G6oW4gW2wsIHJdIHNhbyBjaG8gYml0IHRo4bupIGsgY+G7p2EgbsOzID0gMQoKLy8gKioqxJDhu5FpIHbhu5tpIHRydXkgduG6pW4gdXBkYXRlKioqOiAKLy8gWMOpdCDEkW/huqFuIFtsLCByXSBi4bqldCBrw6wsIGdp4bqjIHPhu60gdGEgY+G6p24geG9yIG3hu5dpIHBo4bqnbiB04butIHbhu5tpIHgKLy8gVGEgY2jhu4kgY+G6p24geMOpdCBuaOG7r25nIGJpdCAxIGPhu6dhIHggKG5o4buvbmcgYml0IGLhurFuZyAwIGtow7RuZyBsw6BtIOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIHRy4buLIGPhu6dhIMSRb+G6oW4gW2wsIHJdKQovLyBHaeG6oyBz4butIGJpdCB0aOG7qSBrIGPhu6dhIHggYuG6sW5nIDE6IAovLyAtIMSQ4buRaSB24bubaSBuaOG7r25nIHBo4bqnbiB04butIHRodeG7mWMgW2wsIHJdIHNhbyBjaG8gYml0IHRo4bupIGsgPSAwLCB0aMOsIGJpdCB0aOG7qSBrIGPhu6dhIGNow7puZyBz4bq9IGLhu4sgdGhheSDEkeG7lWkgdGjDoG5oIDEgIAovLyAtIMSQ4buRaSB24bubaSBuaOG7r25nIHBo4bqnbiB04butIHRodeG7mWMgW2wsIHJdIHNhbyBjaG8gYml0IHRo4bupIGsgPSAxLCB0aMOsIGJpdCB0aOG7qSBrIGPhu6dhIGNow7puZyBz4bq9IGLhu4sgdGhheSDEkeG7lWkgdGjDoG5oIDAgCgovLyBOw6puIHThu6sgxJHDonkgdGEgY8OzIDIwIGPDonkgU2VnbWVudCBUcmVlLCB0cmVlW2tdIHPhur0gcXXhuqNuIGzDrSBuaOG7r25nIHbhu4sgdHLDrSBpIHNhbyBjaG8gYml0IHRo4bupIGsgY+G7p2EgYVtpXSBi4bqxbmcgMQpjb25zdCBpbnQgTiA9IDFlNSArIDU7IAoKaW50IG4sIHE7ICAKaW50IGFbTl07IAoKc3RydWN0IFNlZ1RyZWUgewoJaW50IG47ICAKCXZlY3RvcjxpbnQ+IHNlZywgbGF6eTsgIAoKCVNlZ1RyZWUoKSB7fQoKCVNlZ1RyZWUoaW50IG4pOiBuKG4pIHsKCQlzZWcucmVzaXplKDQgKiBuICsgMSwgMCk7IAoJCWxhenkucmVzaXplKDQgKiBuICsgMSwgMCk7IAoJfQoKCXZvaWQgcHVzaChpbnQgaWQsIGludCBsLCBpbnQgcikgewoJCWlmIChsYXp5W2lkXSA9PSAxKSB7CgkJCWludCBtaWQgPSAobCArIHIpID4+IDE7IAoKCQkJc2VnW2lkICogMl0gPSAobWlkIC0gbCArIDEpIC0gc2VnW2lkICogMl07IAoJCQlsYXp5W2lkICogMl0gXj0gbGF6eVtpZF07IAoKCQkJc2VnW2lkICogMiArIDFdID0gKHIgLSBtaWQpIC0gc2VnW2lkICogMiArIDFdOyAKCQkJbGF6eVtpZCAqIDIgKyAxXSBePSBsYXp5W2lkXTsgCgoJCQlsYXp5W2lkXSA9IDA7ICAKCQl9Cgl9CgoJdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewoJCWlmIChsID4gdiB8fCByIDwgdSkgcmV0dXJuOyAKCgkJaWYgKHUgPD0gbCAmJiByIDw9IHYpIHsKCQkJc2VnW2lkXSA9IChyIC0gbCArIDEpIC0gc2VnW2lkXTsgCgkJCWxhenlbaWRdIF49IDE7IAoJCQlyZXR1cm47IAoJCX0KCgkJcHVzaChpZCwgbCwgcik7ICAKCgkJaW50IG1pZCA9IChsICsgcikgPj4gMTsgIAoJCXVwZGF0ZShpZCAqIDIsIGwsIG1pZCwgdSwgdik7IAoJCXVwZGF0ZShpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsgCgoJCXNlZ1tpZF0gPSBzZWdbaWQgKiAyXSArIHNlZ1tpZCAqIDIgKyAxXTsgCgl9CgoJaW50IGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CgkJaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm4gMDsgICAKCgkJaWYgKHUgPD0gbCAmJiByIDw9IHYpIHJldHVybiBzZWdbaWRdOyAKCgkJcHVzaChpZCwgbCwgcik7IAoKCQlpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKCQlyZXR1cm4gZ2V0KGlkICogMiwgbCwgbWlkLCB1LCB2KSArIGdldChpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsgCgl9Cn07IAoKU2VnVHJlZSB0cmVlWzIwXTsgIAoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07IAoJCQoJZm9yIChpbnQgayA9IDA7IGsgPD0gMTk7IGsrKykgewoJCXRyZWVba10gPSBTZWdUcmVlKG4pOyAgIAoJCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCQlpZiAoKGFbaV0gPj4gaykgJiAxKSB0cmVlW2tdLnVwZGF0ZSgxLCAxLCBuLCBpLCBpKTsgCgkJfQoJfQoKCWNpbiA+PiBxOyAKCgl3aGlsZSAocS0tKSB7CgkJaW50IHR5cGUsIGwsIHI7IAoJCWNpbiA+PiB0eXBlID4+IGwgPj4gcjsgCgoJCWlmICh0eXBlID09IDIpIHsKCQkJaW50IHg7IGNpbiA+PiB4OyAgCgkJCWZvciAoaW50IGsgPSAwOyBrIDw9IDE5OyBrKyspIHsKCQkJCWlmICgoeCA+PiBrKSAmIDEpIHRyZWVba10udXBkYXRlKDEsIDEsIG4sIGwsIHIpOyAKCQkJfSAKCQl9CgkJZWxzZSB7CgkJCWxsIGFucyA9IDA7ICAKCQkJZm9yIChpbnQgayA9IDA7IGsgPD0gMTk7IGsrKykgewoJCQkJYW5zICs9ICgxbGwgPDwgaykgKiB0cmVlW2tdLmdldCgxLCAxLCBuLCBsLCByKTsgCgkJCX0KCQkJY291dCA8PCBhbnMgPDwgJ1xuJzsKCQl9Cgl9Cn0=