#include <bits/stdc++.h>
#define ll long long
#define MAXN 100010
using namespace std;
ll n,sz,a[MAXN];
struct seg_tree
{
    vector<ll> st;
    void Init()
    {
        sz=1;
        while (sz<n)
            sz <<= 1;
        st.resize(2*sz+2);
    }
    void Update(ll pos,ll val,ll x,ll lx,ll rx)
    {
        if (lx==rx)
        {
            st[x]=val;
            return;
        }
        ll mid=(lx+rx)/2;
        if (pos<=mid)
            Update(pos,val,2*x,lx,mid);
        else
            Update(pos,val,2*x+1,mid+1,rx);
        st[x]=st[2*x]+st[2*x+1];
    }
    ll Calc(ll l,ll r,ll x,ll lx,ll rx)
    {
        if (lx>=l && rx<=r)
            return st[x];
        if (lx>r || rx<l)
            return 0;
        ll mid=(lx+rx)/2;
        return Calc(l,r,2*x,lx,mid)+Calc(l,r,2*x+1,mid+1,rx);
    }
};
seg_tree S[31];
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll q,t,k,x;
    cin >> n;
    for (ll i=0;i<30;i++)
        S[i].Init();
    for (ll i=1;i<=n;i++)
    {
        cin >> a[i];
        for (ll j=0;j<30;j++)
        {
            if ((1ll<<j)&a[i])
            {
                S[j].Update(i,1,1,1,sz);
            }
        }
    }
    cin >> q;
    while (q--)
    {
        cin >> t >> k;
        if (t)
        {
            cin >> x;
            a[k]=x;
            for (ll j=0;j<30;j++)
            {
                if ((1ll<<j)&a[k])
                    S[j].Update(k,1,1,1,sz);
                else
                    S[j].Update(k,0,1,1,sz);
            }
            continue;
        }
        ll ans=0;
        for (ll j=0;j<30;j++)
        {
            ll num=S[j].Calc(k,n,1,1,sz);
            if (num>k-1-S[j].Calc(1,k-1,1,1,sz))
                ans+=(1ll<<j);
        }
        cout << ans << "\n";
    }
    return 0;
}