結果
| 問題 | No.3423 Minimum Xor Query |
| コンテスト | |
| ユーザー |
y_1
|
| 提出日時 | 2026-01-11 16:05:26 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,839 bytes |
| 記録 | |
| コンパイル時間 | 3,914 ms |
| コンパイル使用メモリ | 351,236 KB |
| 実行使用メモリ | 145,320 KB |
| 最終ジャッジ日時 | 2026-01-11 16:05:43 |
| 合計ジャッジ時間 | 16,460 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | TLE * 1 -- * 17 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n,q; cin >> n >> q;
vector<int> a(n);
for(int i = 0; i < n; i++)cin >> a[i];
int B = sqrt(n);
vector<multiset<int>> pref_s((n + B - 1) / B);
vector<multiset<int>> pref_t((n + B - 1) / B);
auto add = [&](multiset<int> &S, multiset<int> &T, int 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<int> &S, multiset<int> &T, int 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 ^ *it3);
}
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;
int 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 {
int ans = 1LL<<30;
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]));
}
}
vector<int> v;
for(int i = r / B * B; i <= r; i++){
v.push_back(a[i]);
}
sort(v.begin(), v.end());
for(int i = 0; i < (int)v.size() - 1; i++){
ans = min(ans , a[i] ^ a[i+1]);
}
cout << ans << endl;
}
}
}
y_1