#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector<ll> st1, st2, I, D;
void updatePair(ll x, ll nod)
{
    st1[nod] = x;
    nod /= 2;
    while (nod > 0)
    {
        st1[nod] = st1[nod * 2] ^ st1[nod * 2 + 1];
        nod /= 2;
    }
}
void updateImpair(ll x, ll nod)
{
    st2[nod] = x;
    nod /= 2;
    while (nod > 0)
    {
        st2[nod] = st2[nod * 2] ^ st2[nod * 2 + 1];
        nod /= 2;
    }
}
ll calcPair(ll a, ll b, ll nod)
{
    if (I[nod] > b || D[nod] < a)
        return 0;
    if (I[nod] >= a && D[nod] <= b)
        return st1[nod];
    return calcPair(a, b, nod * 2) ^ calcPair(a, b, nod * 2 + 1);
}
ll calcImpair(ll a, ll b, ll nod)
{
    if (I[nod] > b || D[nod] < a)
        return 0;
    if (I[nod] >= a && D[nod] <= b)
        return st2[nod];
    return calcImpair(a, b, nod * 2) ^ calcImpair(a, b, nod * 2 + 1);
}
int main()
{
    ll n, i, j, k, q, x, pot = 1, tam, op, l, r;
    scanf("%lld %lld", &n, &q);
    while (pot < n)
        pot *= 2;
    st1.resize(pot * 2, 0);
    st2.resize(pot * 2, 0);
    I.resize(pot * 2);
    D.resize(pot * 2);
    for (i = 0; i < n; i++)
    {
        scanf("%lld", &x);
        if (i % 2 == 0)
            updatePair(x, i + pot);
        else
            updateImpair(x, i + pot);
    }
    for (i = pot; i < pot * 2; i++)
        I[i] = D[i] = i;
    for (i = pot - 1; i > 0; i--)
    {
        I[i] = I[i * 2];
        D[i] = D[i * 2 + 1];
    }
    while (q--)
    {
        scanf("%lld", &op);
        if (op == 1)
        {
            scanf("%lld %lld", &i, &x);
            i--;
            if (i % 2 == 0)
                updatePair(x, i + pot);
            else
                updateImpair(x, i + pot);
        }
        else
        {
            scanf("%lld %lld", &l, &r);
            tam = (r - l) + 1;
            l--;
            r--;
            if (tam % 2 == 0)
                cout << 0 << '\n';
            else
            {
                if (l % 2 == 0)
                    cout << calcPair(l + pot, r + pot, 1) << '\n';
                else
                    cout << calcImpair(l + pot, r + pot, 1) << '\n';
            }
        }
    }
    return 0;
}
Compilation message (stderr)
xoranges.cpp: In function 'int main()':
xoranges.cpp:50:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |     scanf("%lld %lld", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~
xoranges.cpp:59:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |         scanf("%lld", &x);
      |         ~~~~~^~~~~~~~~~~~
xoranges.cpp:74:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |         scanf("%lld", &op);
      |         ~~~~~^~~~~~~~~~~~~
xoranges.cpp:77:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |             scanf("%lld %lld", &i, &x);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~
xoranges.cpp:86:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |             scanf("%lld %lld", &l, &r);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~| # | 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... |