#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define ertunt return
using namespace std;
ll mod = 10007;
vector<ll> adj[600007];
vector<ll>vis(200005);
vector<ll> f(600005), inv(600005);
ll modpow(ll a, ll b){
ll r = 1;
while(b){
if(b & 1){
r *= a;
r %= mod;
}
a *= a;
a %= mod;
b >>= 1;
}
ertunt r;
}
ll nCk(ll n, ll k){
if(k < 0 || k > n) ertunt 0;
ertunt f[n] * inv[k] % mod * inv[n - k] % mod;
}
struct segtree{
vector<ll>d;
ll n;
segtree(ll _n){
d.resize(4*_n,0);
n = _n;
}
void update(ll v,ll l,ll r,ll val,ll pos){
if(pos < l or pos > r)return;
if(l == r){
d[v] = val;
return;
}
ll m = (l+r)>>1;
update(v*2,l,m,val,pos);
update(v*2+1,m+1,r,val,pos);
d[v] = d[v*2]^d[v*2+1];
}
ll query(ll v,ll l,ll r,ll L, ll R){
if(R < l or L > r)ertunt 0;
if(L <= l and r <= R) ertunt d[v];
ll m = (l+r)>>1;
return query(v*2,l,m,L,R)^query(v*2+1,m+1,r,L,R);
}
ll query(ll L,ll R){
return query(1,1,n,L,R);
}
void update(ll val, ll pos){
update(1,1,n,val,pos);
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
ll n,q;
cin >> n >> q;
segtree gang(n),dang(n);
for(ll i = 1; i <= n; i++){
ll x;
cin >> x;
if(i%2)gang.update(x,i);
else dang.update(x,i);
}
while(q--){
ll t;
cin >> t;
if(t == 1){
ll i,j;
cin >> i >> j;
if(i%2)gang.update(j,i);
else dang.update(j,i);
}
else{
ll l,r;
cin >> l >> r;
if((l-r+1)%2 == 0)cout << 0 << '\n';
else{
if(l%2)cout << gang.query(l,r) << '\n';
else cout << dang.query(l,r) << '\n';
}
}
}
}