// Telebe of adicto yani AzeTurk810
//
// WHY ARE YOU STARING MY CODE Stranger ??!!
//
//GO AWAY AND DON T look my CODE if i don t know you or you are stalker !!!!(hrrr)
//
// here about me: I am alone of course, fun , ' , ' , love pyhcics , young(child) , love music , had birds , not a gamer , chess :) , dead to football , you are looking to code , ... ;
//
// why at 1 japon army march they say "the enemy geniral is a hero , an equal to no one. Both in glory and in victory
// the men that follow him are also brave , fearless wariors ..."?
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
# define int ll
# define ln '\n'
# define INFi 1e9
# define INFll 1e18
ll sum(ll a , ll b) {
    return ((a + b) * (b - a + 1))/2;
}
struct segmentTree {
    int N , Null_val;
    vector<array<int,2>> t;
    segmentTree(int _n) {
        t.resize(_n * 4);
        N = _n;
    }
    void build(int v , int l , int r , vector<int> &a) {
        if(l == r) {
            t[v][l&1] = a[l];
            return;
        }
        int mid = (l + r) >> 1;
        build((v << 1) , l , mid , a);
        build((v << 1)|1 , mid + 1 , r , a);
        t[v][0] = (t[(v << 1)][0] ^ t[(v << 1)|1][0]);
        t[v][1] = (t[(v << 1)][1] ^ t[(v << 1)|1][1]);
    }
    void upd(int v , int l , int r  , int &val , int &pos) {
        if(l == r) {
            t[v][l & 1] = val;
            return;
        }
        int mid = (l + r) >> 1;
        if(mid >= pos) upd((v << 1) , l , mid , val, pos);
        else upd((v << 1)|1 , mid + 1 , r , val , pos);
        t[v][0] = (t[(v << 1)][0] ^ t[(v << 1)|1][0]);
        t[v][1] = (t[(v << 1)][1] ^ t[(v << 1)|1][1]);
    }
    array<int , 2 > ask(int v , int l , int r , int ql , int qr ,int id) {
        if(ql > r || l > qr) return {0 , 0};
        if(ql <= l && r <= qr) return t[v];
        int mid = (l + r) >> 1;
        array<int,2> res1 = ask((v << 1) , l , mid , ql , qr , id) , res2 = ask((v << 1)|1 , mid + 1 , r , ql , qr , id);
        array<int,2> res = {
            res1[0] ^ res2[0] ,
            res1[1] ^ res2[1]
        };
        return res;
    }
};
void solve() {
    int n , q;
    cin >> n >> q;
    vector<int> a(n);
    for(int &i : a) cin >> i;
    segmentTree t(n);
    t.build(1 , 0 , n - 1 , a);
    while(q--) {
        int tt;
        cin >> tt;
        if(tt == 1) {
            int pos , val;
            cin >> pos >> val;
            pos--;
            t.upd(1 , 0 , n - 1 , val , pos);
        } else {
            int l , r;
            cin >> l >> r;
            l--;r--;
            if((r - l + 1)& 1) {
                cout << t.ask(1 , 0 , n - 1 , l , r , l & 1)[l&1] << ln;
            } else {
                cout << 0 << ln;
            }
        }
    }
} 
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while(t--)solve();
}
/*
*/  
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |