#include using namespace std; using ll = long long; int main() { int n,q; cin >> n >> q; vector a(n); for(int i = 0; i < n; i++)cin >> a[i]; int B = sqrt(n); vector> pref_s((n + B - 1) / B); vector> pref_t((n + B - 1) / B); auto add = [&](multiset &S, multiset &T, ll x)->void { S.insert(x); auto it = S.find(x); if(it != S.begin()){ auto it2 = it; it2--; T.insert(*it ^ *it2); } auto it2 = it; it2++; if(it2 != S.end()){ T.insert(*it ^ *it2); } if(it != S.begin() && it2 != S.end()){ auto it3 = it; it3--; T.erase(T.find(*it3 ^ *it2)); } }; auto del = [&](multiset &S, multiset &T, ll x)->void { auto it = S.find(x); if(it != S.begin()){ auto it2 = it; it2--; T.erase(T.find(*it ^ *it2)); } auto it2 = it; it2++; if(it2 != S.end()){ T.erase(T.find(*it ^ *it2)); } if(it != S.begin() && it2 != S.end()){ auto it3 = it; it3--; T.insert(*it2 ^ *it2); } S.erase(it); }; for(int i = 0; i < n; i++){ for(int j = (n + B - 1) / B - 1; i < (j+1) * B; j--){ if(i < (j+1) * B)add(pref_s[j], pref_t[j], a[i]); } } while(q--){ int type; cin >> type; if(type == 1){ int i; cin >> i; ll x; cin >> x; --i; for(int j = (n + B - 1) / B - 1; i < (j+1) * B; j--){ del(pref_s[j], pref_t[j], a[i]); } a[i] = x; for(int j = (n + B - 1) / B - 1; i < (j+1) * B; j--){ add(pref_s[j], pref_t[j], a[i]); } } else { ll ans = 1LL<<60; int r; cin >> r; --r; if(r / B != 0){ ans = *pref_t[r/B-1].begin(); for(int i = r / B * B; i <= r; i++){ auto it = pref_s[r/B-1].lower_bound(a[i]); if(it != pref_s[r/B-1].end()){ ans = min(ans, (*it) ^ (a[i])); } if(it == pref_s[r/B-1].begin())continue; it--; ans = min(ans , (*it) ^ (a[i])); } } multiset tmp_s; multiset tmp_t; for(int i = r / B * B; i <= r; i++){ add(tmp_s, tmp_t, a[i]); } if(tmp_t.size() >= 1)ans = min(ans, *tmp_t.begin()); cout << ans << endl; } } }