#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
// Bài này các em 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ứ i đóng góp vào trong đáp án là: 2^i * cnt(i, l, r)
// với cnt(i, l, r) là số lượng phần tử trong đoạn [l, r] sao cho bit thứ i 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ứ i của x bằng 1:
// - Đối với những phần tử thuộc [l, r] sao cho bit thứ i = 0, thì bit thứ i của bọn nó bây giờ sẽ bằng 1 |
// - Đối với những phần tử thuộc [l, r] sao cho bit thứ i = 1, thì bit thứ i của bọn nó bây giờ sẽ bằng 0 | (tính chất của phép xor)
// Nên từ đây mấy em sẽ có 20 cây Segment Tree, seg[i] sẽ quản lí những vị trí pos sao cho bit thứ i của a[pos] 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 seg[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 bit = 0; bit <= 19; bit++) {
seg[bit] = segTree(n);
for (int i = 1; i <= n; i++) {
if ((a[i] >> bit) & 1) seg[bit].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 bit = 0; bit <= 19; bit++) {
if ((x >> bit) & 1) seg[bit].update(1, 1, n, l, r);
}
}
else {
ll ans = 0;
for (int bit = 0; bit <= 19; bit++) {
ans += (1ll << bit) * seg[bit].get(1, 1, n, l, r);
}
cout << ans << '\n';
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAKY29uc3QgbGwgTElORiA9IDFlMTg7ICAKCi8vIELDoGkgbsOgeSBjw6FjIGVtIGPDsyB0aOG7gyB44butIGzDrSDEkeG7mWMgbOG6rXAgdGhlbyB04burbmcgYml0CgovLyAqKirEkOG7kWkgduG7m2kgdHJ1eSB24bqlbiBnZXQqKio6IAovLyBYw6l0IMSRb+G6oW4gW2wsIHJdIGLhuqV0IGvDrCwgZ2nhuqMgc+G7rSB0YSBj4bqnbiB0w61uaCBhW2xdICsgYVtsICsgMV0gKyBhW2wgKyAyXSArIC4uLiArIGFbcl0gCi8vIHRow6wgZ2nDoSB0cuG7iyBtw6AgYml0IHRo4bupIGkgxJHDs25nIGfDs3AgdsOgbyB0cm9uZyDEkcOhcCDDoW4gbMOgOiAyXmkgKiBjbnQoaSwgbCwgcikgCi8vIHbhu5tpIGNudChpLCBsLCByKSBsw6Agc+G7kSBsxrDhu6NuZyBwaOG6p24gdOG7rSB0cm9uZyDEkW/huqFuIFtsLCByXSBzYW8gY2hvIGJpdCB0aOG7qSBpIGPhu6dhIG7DsyA9IDEKCi8vICoqKsSQ4buRaSB24bubaSB0cnV5IHbhuqVuIHVwZGF0ZSoqKjogCi8vIFjDqXQgxJFv4bqhbiBbbCwgcl0gYuG6pXQga8OsLCBnaeG6oyBz4butIHRhIGPhuqduIHhvciBt4buXaSBwaOG6p24gdOG7rSB24bubaSB4Ci8vIFRhIGNo4buJIGPhuqduIHjDqXQgbmjhu69uZyBiaXQgMSBj4bunYSB4IChuaOG7r25nIGJpdCBi4bqxbmcgMCBraMO0bmcgbMOgbSDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nDoSB0cuG7iyBj4bunYSDEkW/huqFuIFtsLCByXSkKLy8gR2nhuqMgc+G7rSBiaXQgdGjhu6kgaSBj4bunYSB4IGLhurFuZyAxOiAKLy8gLSDEkOG7kWkgduG7m2kgbmjhu69uZyBwaOG6p24gdOG7rSB0aHXhu5ljIFtsLCByXSBzYW8gY2hvIGJpdCB0aOG7qSBpID0gMCwgdGjDrCBiaXQgdGjhu6kgaSBj4bunYSBi4buNbiBuw7MgYsOieSBnaeG7nSBz4bq9IGLhurFuZyAxIHwgCi8vIC0gxJDhu5FpIHbhu5tpIG5o4buvbmcgcGjhuqduIHThu60gdGh14buZYyBbbCwgcl0gc2FvIGNobyBiaXQgdGjhu6kgaSA9IDEsIHRow6wgYml0IHRo4bupIGkgY+G7p2EgYuG7jW4gbsOzIGLDonkgZ2nhu50gc+G6vSBi4bqxbmcgMCB8ICh0w61uaCBjaOG6pXQgY+G7p2EgcGjDqXAgeG9yKQoKLy8gTsOqbiB04burIMSRw6J5IG3huqV5IGVtIHPhur0gY8OzIDIwIGPDonkgU2VnbWVudCBUcmVlLCBzZWdbaV0gc+G6vSBxdeG6o24gbMOtIG5o4buvbmcgduG7iyB0csOtIHBvcyBzYW8gY2hvIGJpdCB0aOG7qSBpIGPhu6dhIGFbcG9zXSBi4bqxbmcgMQoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKCmludCBuLCBxOyAgCmludCBhW05dOyAKCnN0cnVjdCBzZWdUcmVlIHsKCWludCBuOyAgCgl2ZWN0b3I8aW50PiBzZWcsIGxhenk7ICAKCglzZWdUcmVlKCkge30KCglzZWdUcmVlKGludCBuKTogbihuKSB7CgkJc2VnLnJlc2l6ZSg0ICogbiArIDEsIDApOyAKCQlsYXp5LnJlc2l6ZSg0ICogbiArIDEsIDApOyAKCX0KCgl2b2lkIHB1c2goaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKCQlpZiAobGF6eVtpZF0gPT0gMSkgewoJCQlpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKCgkJCXNlZ1tpZCAqIDJdID0gKG1pZCAtIGwgKyAxKSAtIHNlZ1tpZCAqIDJdOyAKCQkJbGF6eVtpZCAqIDJdIF49IGxhenlbaWRdOyAKCgkJCXNlZ1tpZCAqIDIgKyAxXSA9IChyIC0gbWlkKSAtIHNlZ1tpZCAqIDIgKyAxXTsgCgkJCWxhenlbaWQgKiAyICsgMV0gXj0gbGF6eVtpZF07IAoKCQkJbGF6eVtpZF0gPSAwOyAgCgkJfQoJfQoKCXZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpIHsKCQlpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybjsgCgoJCWlmICh1IDw9IGwgJiYgciA8PSB2KSB7CgkJCXNlZ1tpZF0gPSAociAtIGwgKyAxKSAtIHNlZ1tpZF07IAoJCQlsYXp5W2lkXSBePSAxOyAKCQkJcmV0dXJuOyAKCQl9CgoJCXB1c2goaWQsIGwsIHIpOyAgCgoJCWludCBtaWQgPSAobCArIHIpID4+IDE7ICAKCQl1cGRhdGUoaWQgKiAyLCBsLCBtaWQsIHUsIHYpOyAKCQl1cGRhdGUoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgdSwgdik7IAoKCQlzZWdbaWRdID0gc2VnW2lkICogMl0gKyBzZWdbaWQgKiAyICsgMV07IAoJfQoKCWludCBnZXQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewoJCWlmIChsID4gdiB8fCByIDwgdSkgcmV0dXJuIDA7ICAgCgoJCWlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gc2VnW2lkXTsgCgoJCXB1c2goaWQsIGwsIHIpOyAKCgkJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgkJcmV0dXJuIGdldChpZCAqIDIsIGwsIG1pZCwgdSwgdikgKyBnZXQoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgdSwgdik7IAoJfQp9OyAKCnNlZ1RyZWUgc2VnWzIwXTsgIAoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07IAoJCQoJZm9yIChpbnQgYml0ID0gMDsgYml0IDw9IDE5OyBiaXQrKykgewoJCXNlZ1tiaXRdID0gc2VnVHJlZShuKTsgICAKCQlmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQkJaWYgKChhW2ldID4+IGJpdCkgJiAxKSBzZWdbYml0XS51cGRhdGUoMSwgMSwgbiwgaSwgaSk7IAoJCX0KCX0KCgljaW4gPj4gcTsgCgoJd2hpbGUgKHEtLSkgewoJCWludCB0eXBlLCBsLCByOyAKCQljaW4gPj4gdHlwZSA+PiBsID4+IHI7IAoKCQlpZiAodHlwZSA9PSAyKSB7CgkJCWludCB4OyBjaW4gPj4geDsgIAoJCQlmb3IgKGludCBiaXQgPSAwOyBiaXQgPD0gMTk7IGJpdCsrKSB7CgkJCQlpZiAoKHggPj4gYml0KSAmIDEpIHNlZ1tiaXRdLnVwZGF0ZSgxLCAxLCBuLCBsLCByKTsgCgkJCX0gCgkJfQoJCWVsc2UgewoJCQlsbCBhbnMgPSAwOyAgCgkJCWZvciAoaW50IGJpdCA9IDA7IGJpdCA8PSAxOTsgYml0KyspIHsKCQkJCWFucyArPSAoMWxsIDw8IGJpdCkgKiBzZWdbYml0XS5nZXQoMSwgMSwgbiwgbCwgcik7IAoJCQl9CgkJCWNvdXQgPDwgYW5zIDw8ICdcbic7CgkJfQoJfQp9