萌新第17个点挂了,与答案差了8!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
ll n, m, opt, l, r, x, ak[N];
struct SegmentTree {
ll add[N << 2], sum[N << 2], k;
inline void getup(int rt) {
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
inline void build(int l, int r, int rt) {
if (l == r) {
sum[rt] = bool(ak[l] & 1 << k);
return;
}
int mid = (l + r) >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
getup(rt);
}
inline void pushdown(int rt, int len) {
if (add[rt]) {
add[rt << 1] ^= 1;
add[rt << 1 | 1] ^= 1;
sum[rt << 1] = (len - (len >> 1)) - sum[rt << 1];
sum[rt << 1 | 1] = (len >> 1) - sum[rt << 1 | 1];
add[rt] = 0;
}
}
inline ll query(int L, int R, int l, int r, int rt) {
if (l >= L && r <= R) return sum[rt];
pushdown(rt, r - l + 1);
int mid = (r + l) >> 1;
ll tot = 0;
if (L <= mid) tot += query(L, R, l, mid, rt << 1);
if (mid + 1 <= R) tot += query(L, R, mid + 1, r, rt << 1 | 1);
return tot;
}
inline void xor_change(int L, int R, int l, int r, int rt) {
pushdown(rt, r - l + 1);
if (l >= L && r <= R) {
add[rt] ^= 1;
sum[rt] = r - l + 1 - sum[rt];
return;
}
int mid = (l + r) >> 1;
if (L <= mid) xor_change(L, R, l, mid, rt << 1);
if (mid + 1 <= R) xor_change(L, R, mid + 1, r, rt << 1 | 1);
getup(rt);
}
} bits[25];
int main() {
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> ak[i];
for (int i = 0; i <= 22; i ++)
bits[i].k = i, bits[i].build(1, n, 1);
cin >> m;
for (int i = 1; i <= m; i ++) {
cin >> opt >> l >> r;
if (opt == 1) {
ll sum = 0;
for (int j = 0; j <= 22; j ++)
sum += bits[j].query(l, r, 1, n, 1) * (1 << j);
cout << sum << '\n';
} else {
cin >> x;
for (int j = 0; j <= 22; j ++)
if (x & 1 << j) bits[j].xor_change(l, r, 1, n, 1);
}
}
return 0;
}