#include <bits/stdc++.h>
using namespace std;
const int M = 1e5 + 100;
struct segtree
{
long long tree[M << 3], in[M];
int l[M << 3], r[M << 3];
bool lazy[M << 3];
#define lc (n << 1)
#define rc (n << 1 | 1)
void init()
{
memset(lazy, 0, sizeof(lazy));
}
void pushup(int n)
{
tree[n] = tree[lc] + tree[rc];
}
void pushdown(int n)
{
if (lazy[n])
tree[n] = r[n] - l[n] + 1 - tree[n];
lazy[lc] = lazy[n] ^ lazy[lc], lazy[rc] = lazy[n] ^ lazy[rc];
lazy[n] = false;
}
void build(int n, int l, int r)
{
this->l[n] = l, this->r[n] = r;
if (l == r)
{
tree[n] = in[l];
return;
}
int mid = l + r >> 1;
build(lc, l, mid), build(rc, mid + 1, r);
pushup(n);
}
int query(int n, int dl, int dr)
{
pushdown(n);
if (dl == l[n] && dr == r[n])
return tree[n];
int mid = l[n] + r[n] >> 1;
if (dr <= mid)
return query(lc, dl, dr);
if (dl > mid)
return query(rc, dl, dr);
return query(lc, dl, mid) + query(rc, mid + 1, dr);
}
void modify(int n, int dl, int dr)
{
pushdown(n);
if (dl == l[n] && dr == r[n])
{
lazy[n] ^= 1;
return;
}
tree[n] = tree[n] + dr - dl + 1 - 2 * query(1, dl, dr);
int mid = l[n] + r[n] >> 1;
if (dr <= mid)
modify(lc, dl, dr);
else if (dl > mid)
modify(rc, dl, dr);
else
modify(lc, dl, mid), modify(rc, mid + 1, dr);
}
} tree[12];
int n, init, d[12];
int main()
{
for (int i = 0; i < 12; i++)
tree[i].init();
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &init);
for (int j = 0; j < 12; j++)
{
tree[j].in[i] = init & 1;
init >>= 1;
}
}
d[0] = 1;
for (int i = 1; i < 12; i++)
d[i] = d[i - 1] << 1;
for (int i = 0; i < 12; i++)
tree[i].build(1, 1, n);
scanf("%d", &n);
while (n--)
{
int opt, x, y, z;
scanf("%d", &opt);
if (opt == 1)
{
scanf("%d%d", &x, &y);
long long ans = 0;
for (int i = 0; i < 12; i++)
{
ans += 1ll * tree[i].query(1, x, y) * d[i];
}
printf("%lld\n", ans);
}
else
{
scanf("%d%d%d", &x, &y, &z);
for (int i = 0; i < 12; i++)
if ((z >> i) & 1)
tree[i].modify(1, x, y);
}
}
return 0;
}
从第11个点开始WA