评测记录,求卡常或指出错误。
#include <bits/stdc++.h>
#define arrout(a, n) rep(i, 1, n) printk(a[i])
#define arrin(a, n) rep(i, 1, n) a[i] = read()
#define rep(i, x, n) for(int i = x; i <= n; i++)
#define dep(i, x, n) for(int i = x; i >= n; i--)
#define erg(i, x) for(int i = head[x]; i; i = e[i].nex)
#define dbg(x) std::cout << #x << ":" << x << " "
#define mem(a, x) memset(a, x, sizeof a)
#define all(x) x.begin(), x.end()
#define arrall(a, n) a + 1, a + 1 + n
#define PII std::pair<int, int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
// #define int long long
#define il inline
#define ss second
#define ff first
#define itn int
int read() {
char ch = getchar();
int r = 0, w = 1;
while(ch < '0' || ch > '9') w = ch == '-' ? -1 : w, ch = getchar();
while(ch >= '0' && ch <= '9') r = (r << 3) + (r << 1) + (ch ^ 48), ch = getchar();
return r * w;
}
void print(int x) {
if(x < 0) putchar('-'), x = -x;
if(x >= 10) print(x / 10);
putchar(x % 10 + '0');
}template<typename ...Args>
void print(int t, Args... args) { print(t), print(args...); }
void printl(int x) { print(x), putchar('\n'); }
template<typename ...Args>
void printl(int t, Args... args) { printl(t), printl(args...); }
void printk(int x) { print(x), putchar(' '); }
template<typename ...Args>
void printk(int t, Args ... args) { printk(t), printk(args...); }
CI N = 5e4 + 5;
int n, q, a[N], b[N];
struct Basis {
int p[32];
Basis() { mem(p, 0); }
void clear() { mem(p, 0); }
void insert(int x) {
if(!x) return ;
dep(i, 31, 0) if((x >> i) & 1) {
if(!p[i]) {
p[i] = x;
return ;
}
x ^= p[i];
}
}
int find(int v) {
int ans = v;
dep(i, 31, 0) ans = std::max(ans, ans ^ p[i]);
return ans;
}
Basis operator+(Basis b) const {
Basis ans;
dep(i, 31, 0) ans.insert(p[i]), ans.insert(b.p[i]);
return ans;
}
Basis& operator+=(const Basis& b){ return *this = *this + b; }
} ans;
struct Binary_Indexed_Tree {
int c[N];
int lowbit(int x) { return x & (-x); }
void update(int x, int v) { for(int i = x; i <= n; i += lowbit(i)) c[i] ^= v; }
int query(int x) {
int ans = 0;
for(int i = x; i; i -= lowbit(i)) ans ^= c[i];
return ans;
}
} bit;
struct Segment_Tree {
#define ls k << 1
#define rs k << 1 | 1
Basis s[N << 2];
void pushup(int k) { s[k] = s[ls] + s[rs]; }
void update(int x, int v, int k = 1, int l = 1, int r = n) {
if(l == r) {
s[k].clear(), s[k].insert(v);
return ;
}
int mid = l + r >> 1;
if(x <= mid) update(x, v, ls, l, mid);
else update(x, v, rs, mid + 1, r);
pushup(k);
}
Basis query(int x, int y, int k = 1, int l = 1, int r = n) {
if(x <= l && r <= y) return s[k];
int mid = l + r >> 1;
Basis ans;
if(x <= mid) ans = ans + query(x, y, ls, l, mid);
if(y > mid) ans = ans + query(x, y, rs, mid + 1, r);
return ans;
}
#undef ls
#undef rs
} st;
signed main() {
n = read(), q = read();
arrin(a, n);
rep(i, 1, n) b[i] = a[i] ^ a[i - 1], bit.update(i, b[i]), st.update(i, b[i]);
while(q --) {
int op = read(), l = read(), r = read(), v = read();
if(op == 1) {
bit.update(l, v), bit.update(r + 1, v);
st.update(l, b[l] ^= v), st.update(r + 1, b[r + 1] ^= v);
} else {
int k = bit.query(l);
if(l == r) { printl(std::max(k, k ^ v)); continue; }
ans.clear();
ans.insert(k);
ans = st.query(l + 1, r), ans.insert(k);
printl(ans.find(v));
}
}
return 0;
}