RT
样例输出第三行为560,我的输出为564,提交后仍能够通过本题。
这是评测记录。
这是我的代码:
#include <algorithm>
#include <cstdint>
#include <iostream>
using u32 = uint32_t;
constexpr int MXL = 32;
constexpr size_t N = 1 << 20;
int n, m;
u32 a[N], b[N];
struct lb {
u32 a[MXL];
lb &ins(u32 x) {
if (!x) return *this;
for (int i = MXL - 1; i >= 0; i--) {
if (x & (1u << i)) {
if (!a[i]) return a[i] = x, *this;
else x ^= a[i];
}
}
return *this;
}
u32 calc(u32 v) {
for (int i = MXL - 1; i >= 0; i--) { v = std::max(v, v ^ a[i]); }
return v;
}
lb &operator+=(const lb &a) {
for (int i = MXL - 1; i >= 0; i--) { (*this).ins(a.a[i]); }
return *this;
}
friend lb operator+(const lb &a, const lb &b) { return lb(a) += b; }
};
#define lch (p * 2)
#define rch (p * 2 + 1)
#define mid ((cl + cr) / 2)
struct node {
lb a;
u32 v;
} t[N << 2];
void sync_value(int p) { t[p].a = t[lch].a + t[rch].a, t[p].v = t[lch].v ^ t[rch].v; }
void build(int p = 1, int cl = 1, int cr = n) {
if (cl == cr) return t[p].a.ins(b[cl]), t[p].v = b[cl], void();
build(lch, cl, mid), build(rch, mid + 1, cr);
sync_value(p);
}
void _upd(int x, u32 d, int p = 1, int cl = 1, int cr = n) {
if (cl == cr) return b[cl] ^= d, t[p].a = lb{}, t[p].a.ins(b[cl]), t[p].v = b[cl], void();
(x <= mid) ? _upd(x, d, lch, cl, mid) : _upd(x, d, rch, mid + 1, cr);
sync_value(p);
}
lb _quea(int l, int r, int p = 1, int cl = 1, int cr = n) {
if (cl == l && cr == r) return t[p].a;
if (r <= mid) return _quea(l, r, lch, cl, mid);
else if (l > mid) return _quea(l, r, rch, mid + 1, cr);
else return _quea(l, mid, lch, cl, mid) + _quea(mid + 1, r, rch, mid + 1, cr);
}
u32 _quev(int l, int r, int p = 1, int cl = 1, int cr = n) {
if (cl == l && cr == r) return t[p].v;
if (r <= mid) return _quev(l, r, lch, cl, mid);
else if (l > mid) return _quev(l, r, rch, mid + 1, cr);
else return _quev(l, mid, lch, cl, mid) ^ _quev(mid + 1, r, rch, mid + 1, cr);
}
void upd(int l, int r, u32 d) { _upd(l, d), _upd(r + 1, d); }
u32 que(int l, int r, u32 v) {
u32 k = _quev(1, l);
return (l == r) ? std::max(v, v ^ k) : _quea(l + 1, r).ins(k).calc(v);
}
int main() {
std::ios::sync_with_stdio(false);
std::cin >> n >> m;
for (int i = 1; i <= n; i++) std::cin >> a[i];
for (int i = 1; i <= n; i++) b[i] = a[i] ^ a[i - 1];
build();
for (int i = 1; i <= m; i++) {
int opt, l, r;
u32 v;
std::cin >> opt >> l >> r >> v;
if (opt == 1) upd(l, r, v);
else std::cout << que(l, r, v) << "\n";
}
return 0;
}