// (⁠◕⁠ᴗ⁠◕⁠✿⁠) // #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include #define rep(i, n) for (ll i = 0; i < (n); i++) #define srep(i, s, n) for (ll i = s; i < (n); i++) #define len(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() using namespace std; template using vc = vector; template using vv = vc>; template using vvv = vv>; using vi = vc;using vvi = vv; using vvvi = vv; using ll = long long;using vl = vc;using vvl = vv; using vvvl = vv; using ld = long double; using vld = vc; using vvld = vc; using vvvld = vc; using uint = unsigned int; using ull = unsigned long long; const ld pi = 3.141592653589793; const int inf = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3f; // const ll mod = 1000000007; const ll mod = 998244353; inline bool inside(ll y, ll x, ll H, ll W) {return 0 <= (y) and (y) < (H) and 0 <= (x) and (x) < (W); } #define debug(var) do{std::cout << #var << " : \n";view(var);}while(0) template void view(T e){cout << e << endl;} template void view(const vc& v){for(const auto& e : v){ cout << e << " "; } cout << endl;} template void view(const vv& vv){ for(const auto& v : vv){ view(v); } } // https://nyaannyaan.github.io/library/misc/mo.hpp.html //widthの大きさを改造 struct Mo { int width; vector left, right, order; Mo(){} void insert(int l, int r) { /* [l, r) */ left.emplace_back(l); right.emplace_back(r); } void set(int N, int M, int Q){ order.resize(Q); iota(order.begin(), order.end(), 0); width = max(1, sqrt(M * N / (double)Q)); } template void run(const AL &add_left, const AR &add_right, const DL &delete_left, const DR &delete_right, const REM &rem) { assert(left.size() == order.size()); sort(begin(order), end(order), [&](int a, int b) { int ablock = left[a] / width, bblock = left[b] / width; if (ablock != bblock) return ablock < bblock; if (ablock & 1) return right[a] < right[b]; return right[a] > right[b]; }); int nl = 0, nr = 0; for (auto idx : order) { while (nl > left[idx]) add_left(--nl, nr); while (nr < right[idx]) add_right(nr++); while (nl < left[idx]) delete_left(nl++, nr); while (nr > right[idx]) delete_right(--nr); rem(idx); } } }; void solve(vi &A, vc> &query){ int N = len(A), Q = len(query); multiset candidate, adjacents; vi version(N, 0); vvi versionA(N); rep(i, N) versionA[i].push_back(A[i]); vi subQuery; Mo mo; int one_count = 0, real_Q = 0; for (auto [t, a, b] : query){ if (t == 1){ one_count++; a--; versionA[a].push_back(b); subQuery.push_back(a); }else{ real_Q++; mo.insert(one_count, a); } } mo.set(N, one_count, real_Q); vi ans(real_Q); auto add = [&](int x){ auto it = adjacents.lower_bound(x); int l = -1, r = -1; if (it != adjacents.end()){ l = *it; } if (it != adjacents.begin()){ it--; r = *it; } if (l != -1 && r != -1) candidate.erase(candidate.find(l ^ r)); adjacents.insert(x); if (l != -1) candidate.insert(l ^ x); if (r != -1) candidate.insert(r ^ x); }; auto remove = [&](int x){ auto it = adjacents.lower_bound(x); int l = -1, r = -1; it++; if (it != adjacents.end()){ r = *it; } it--; if (it != adjacents.begin()){ it--; l = *it; } adjacents.erase(adjacents.find(x)); if (l != -1) candidate.erase(candidate.find(l ^ x)); if (r != -1) candidate.erase(candidate.find(x ^ r)); if (l != -1 && r != -1) candidate.insert(l ^ r); }; auto add_left = [&](int i, int r){ int idx = subQuery[i]; if (idx < r){ remove(versionA[idx][version[idx]]); version[idx]--; add(versionA[idx][version[idx]]); }else{ version[idx]--; } }; auto delete_left = [&](int i, int r){ int idx = subQuery[i]; if (idx < r){ remove(versionA[idx][version[idx]]); version[idx]++; add(versionA[idx][version[idx]]); }else{ version[idx]++; } }; auto add_right = [&](int i){ add(versionA[i][version[i]]); }; auto delete_right = [&](int i){ remove(versionA[i][version[i]]); }; auto rem = [&](int i){ assert(i < real_Q); ans[i] = *candidate.begin(); }; mo.run(add_left, add_right, delete_left, delete_right, rem); rep(i, real_Q) cout << ans[i] << endl; } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; vi A(N); rep(i, N) cin >> A[i]; vc> query; while (Q--){ int t;cin >> t; if (t == 1){ int i, x; cin >> i >> x; query.emplace_back(t, i, x); }else{ int r; cin >> r; query.emplace_back(t, r, -1); } } solve(A, query); }