#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 1026;
int n, q, mod, a[N], lazy[4 * N];
bitset<M> ans, tr[4 * N];
int read(){
int x = 0, f = 1;
char ch = getchar_unlocked();
for(; ch < '0' || ch > '9'; ch = getchar_unlocked()){
if(ch == '-') f = -1;
}
for(; ch >= '0' && ch <= '9'; ch = getchar_unlocked()){
x = (x << 3) + (x << 1) + ch - '0';
}
return x * f;
}
void build(int id, int l, int r){
if(l == r){
tr[id][a[l]] = 1;
return ;
}
int mid = (l + r) >> 1;
build((id << 1), l, mid), build(((id << 1) | 1), mid + 1, r);
tr[id] = (tr[id << 1] ^ tr[(id << 1) | 1]);
}
void Merge(int id, int x){
tr[id] = ((tr[id] << x) | (tr[id] >> (mod - x)));
lazy[id] = ((lazy[id] + x) & (mod - 1));
}
void tag(int id){
Merge((id << 1), lazy[id]), Merge(((id << 1) | 1), lazy[id]);
lazy[id] = 0;
}
void change(int id, int l, int r, int p, int q, int x){
if(p > q || !x) return ;
if(p <= l && q >= r){
Merge(id, x);
return ;
}
if(r < p || l > q) return ;
int mid = (l + r) >> 1;
tag(id);
change((id << 1), l, mid, p, q, x), change(((id << 1) | 1), mid + 1, r, p, q, x);
tr[id] = (tr[id << 1] ^ tr[(id << 1) | 1]);
}
void query(int id, int l, int r, int p, int q){
if(p > q) return ;
if(p <= l && q >= r){
ans ^= tr[id];
return ;
}
if(r < p || l > q) return ;
int mid = (l + r) >> 1;
tag(id);
query((id << 1), l, mid, p, q), query(((id << 1) | 1), mid + 1, r, p, q);
}
int main(){
ios::sync_with_stdio(0), cin.tie(0);
n = read(), mod = read(), q = read();
mod = (1 << mod);
for(int i = 1; i <= n; i++) a[i] = read();
build(1, 1, n);
for(int i = 1, op, l, r, x; i <= q; i++){
op = read(), l = read(), r = read();
if(l > r) swap(l, r);
if(op == 1){
x = read();
change(1, 1, n, l, r, x);
}
else{
ans.reset();
query(1, 1, n, l, r);
int res = 0;
for(int j = 1; j < mod; j++){
if(ans[j]) res ^= j;
}
cout << res << '\n';
}
}
return 0;
}
前三个点过了,后面的点只有 WA。