// Gemini #include #include #include // --- 最適化プラグマ --- #pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using namespace std; /** * 20ビット(0 ~ 2^20 - 1)の整数を対象とした高速な基数ソート * 10ビットずつ2パスでソートを行います。 */ void radix_sort(int r, const vector& src, vector& dst, vector& tmp) { const int BITS = 10; const int MASK = (1 << BITS) - 1; const int COUNT_SIZE = 1 << BITS; // Pass 1: 下位10ビット int count1[COUNT_SIZE] = {0}; for (int i = 0; i < r; ++i) count1[src[i] & MASK]++; for (int i = 1; i < COUNT_SIZE; ++i) count1[i] += count1[i - 1]; for (int i = r - 1; i >= 0; --i) tmp[--count1[src[i] & MASK]] = src[i]; // Pass 2: 上位10ビット int count2[COUNT_SIZE] = {0}; for (int i = 0; i < r; ++i) count2[(tmp[i] >> BITS) & MASK]++; for (int i = 1; i < COUNT_SIZE; ++i) count2[i] += count2[i - 1]; for (int i = r - 1; i >= 0; --i) dst[--count2[(tmp[i] >> BITS) & MASK]] = tmp[i]; } int main() { // 標準入出力の高速化 ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; if (!(cin >> N >> Q)) return 0; vector A(N); for (int i = 0; i < N; ++i) { cin >> A[i]; } // 作業用バッファ(ソート用) vector sorted_A(N); vector tmp_buffer(N); while (Q--) { int type; cin >> type; if (type == 1) { int i, x; cin >> i >> x; A[i - 1] = x; // 1-indexedを0-indexedに変換 } else { int r; cin >> r; // クエリ2: A[0]...A[r-1] の中から最小XORを求める if (r < 2) { // 制約上 r >= 2 ですが、念のため cout << 0 << "\n"; continue; } // 1. ソート実行 (O(r)) radix_sort(r, A, sorted_A, tmp_buffer); // 2. 隣接項のXORを計算 int min_xor = 1 << 30; // 十分に大きい値 for (int i = 0; i < r - 1; ++i) { int val = sorted_A[i] ^ sorted_A[i + 1]; if (val < min_xor) { min_xor = val; } // これ以上小さくなることはないので早期打ち切り if (min_xor == 0) break; } cout << min_xor << "\n"; } } return 0; }