#include #include #include #include #include #include using namespace std; using ll=long long; ll e(){ return 1LL<<60; } ll op(ll a, ll b){ return min(a,b); } struct S{ set zero_index, one_index; S* zero; S* one; }; void add(S* now, ll x, ll index){ for(ll i=30;i>=0;i--){ if((x>>i)&1){ now->one_index.insert(index); if(now->one==nullptr){ now->one=new S(); } now=now->one; }else{ now->zero_index.insert(index); if(now->zero==nullptr){ now->zero=new S(); } now=now->zero; } } } void erase(S* now, ll x, ll index){ for(ll i=30;i>=0;i--){ if((x>>i)&1){ now->one_index.erase(index); now=now->one; }else{ now->zero_index.erase(index); now=now->zero; } } } ll get_min(S* now, ll x, ll r){ ll res=0; for(ll i=30;i>=0;i--){ if((x>>i)&1){ if(!now->one_index.empty() && *(now->one_index.begin())one; }else{ now=now->zero; } }else{ if(!now->zero_index.empty() && *(now->zero_index.begin())zero; }else{ res|=(1<one; } } } return res; } int main(){ ll N,Q; cin>>N>>Q; vector A(N); for(ll i=0;i>A[i]; } S* root=new S(); atcoder::segtree seg(N); for(ll i=0;i0){ ll c=get_min(root, A[i], i); seg.set(i, c^A[i]); } } for(ll i=0;i>t; if(t==1){ ll idx, x; cin>>idx>>x; idx--; erase(root, A[idx], idx); A[idx]=x; add(root, A[idx], idx); if(idx>0){ ll c=get_min(root, A[idx], idx); seg.set(idx, c^A[idx]); } }else{ ll r; cin>>r; ll ans=seg.prod(0,r); cout<