#include #include #include #include using namespace std; using i32 = int; using i64 = long long; using i128 = __int128_t; using f64 = double; using p2 = pair; using el = tuple; using mint = atcoder::modint998244353; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); _main(); } i64 op(i64 a, i64 b) {return min(a, b);} i64 e() {return 1e18;} void _main() { i64 n, q; cin >> n >> q; vector a(n); vector vs; for (i64 i = 0; i < n; i++) { cin >> a[i]; vs.push_back({a[i], i}); } i64 B = max(1ll, (i64)sqrt(q)); B = 1; vector query(q); for (i64 qi = 0; qi < q; qi++) { i64 op; cin >> op; if (op == 1) { i64 i, x; cin >> i >> x; i--; query[qi] = {op, i, x}; vs.push_back({x, n + qi}); } else { i64 r; cin >> r; r--; query[qi] = {op, r, -1}; } } sort(vs.begin(), vs.end()); for (i64 i = 0; i < n; i++) { a[i] = lower_bound(vs.begin(), vs.end(), (p2){a[i], i}) - vs.begin(); } for (i64 i = 0; i < q; i++) { auto [op, j, x] = query[i]; if (op == 2) continue; x = lower_bound(vs.begin(), vs.end(), (p2){x, n + i}) - vs.begin(); query[i] = {op, j, x}; } atcoder::segtree seg(vs.size()); for (i64 i = 0; i < vs.size(); i++) seg.set(i, n); for (i64 i = 0; i < n; i++) { seg.set(a[i], i); } vector c(n, true); // for (i64 i = 0; i < vs.size(); i++) cout << "(" << vs[i].first << " " << vs[i].second << ") "; // cout << "\n"; atcoder::segtree seg1(n); for (i64 bi = 0; bi * B < q; bi++) { vector v; for (i64 i = bi * B; i < min(q, bi * B + B); i++) { auto [op, j, x] = query[i]; if (op == 2) continue; seg.set(a[j], n); c[j] = false; v.push_back(j); } // for (i64 i = 0; i < n; i++) cout << a[i] << " "; // cout << "()\n"; // for (i64 i = 0; i < n; i++) cout << c[i] << " "; // cout << "?\n"; // for (i64 i = 0; i < vs.size(); i++) cout << seg.get(i) << " "; // cout << "!\n"; sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); for (i64 i = 0; i < n; i++) { if (!c[i]) continue; i64 l = seg.min_left(a[i], [&](i64 x){return x > i;}) - 1; i64 cur = 1e18; if (l >= 0) cur = min(cur, vs[a[i]].first ^ vs[l].first); i64 r = seg.max_right(a[i] + 1, [&](i64 x){return x > i;}); if (r < vs.size()) cur = min(cur, vs[a[i]].first ^ vs[r].first); seg1.set(i, cur); } for (i64 i = bi * B; i < min(q, bi * B + B); i++) { auto [op, r, _] = query[i]; if (op == 1) continue; i64 ans = seg1.prod(0, r + 1); for (i64 ii = bi * B; ii < i; ii++) { auto [op1, j1, x1] = query[ii]; if (op1 == 2) continue; if (j1 > r) continue; i64 cur = 1e18; i64 l = seg.min_left(x1, [&](i64 x){return x > r;}); if (l >= 0) ans = min(ans, vs[x1].first ^ vs[l].first); i64 r = seg.max_right(x1 + 1, [&](i64 x){return x > r;}); if (r < vs.size()) ans = min(ans, vs[x1].first ^ vs[r].first); seg.set(x1, j1); } for (i64 ii = bi * B; ii < i; ii++) { auto [op1, j1, x1] = query[ii]; if (op1 == 2) continue; if (j1 > r) continue; seg.set(x1, n); } cout << ans << "\n"; } for (i64 i = bi * B; i < min(q, bi * B + B); i++) { auto [op, j, x] = query[i]; if (op == 2) continue; c[j] = 1, a[j] = x; } // cout << bi * B << ", "; // for (i64 x : v) cout << x << " "; // cout << "\n"; } }