#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)); 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}; } for (i64 bi = 0; bi * B < q; bi++) { vector c(n, true); 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); } 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; } atcoder::segtree seg1(n); for (i64 i = 0; i < n; i++) { if (!c[i]) { continue; } i64 cur = 1e18; i64 l = seg.min_left(a[i], [&](i64 x){return x >= i;}) - 1; 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 l = seg.min_left(x1, [&](i64 x){return x > R;}) - 1; 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; a[j] = x; } } }