結果
| 問題 | No.3423 Minimum Xor Query |
| コンテスト | |
| ユーザー |
y_1
|
| 提出日時 | 2026-01-11 15:38:22 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,781 bytes |
| 記録 | |
| コンパイル時間 | 3,582 ms |
| コンパイル使用メモリ | 344,640 KB |
| 実行使用メモリ | 137,856 KB |
| 最終ジャッジ日時 | 2026-01-11 15:39:38 |
| 合計ジャッジ時間 | 23,869 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | RE * 18 |
ソースコード
#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<ll>> pref_s((n + B - 1) / B);
vector<multiset<ll>> pref_t((n + B - 1) / B);
auto add = [&](multiset<ll> &S, multiset<ll> &T, ll 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<ll> &S, multiset<ll> &T, ll 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 ^ *it2);
}
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;
ll 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 {
ll ans = 1LL<<60;
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]));
}
}
multiset<ll> tmp_s;
multiset<ll> tmp_t;
for(int i = r / B * B; i <= r; i++){
add(tmp_s, tmp_t, a[i]);
}
if(tmp_t.size() >= 1)ans = min(ans, *tmp_t.begin());
cout << ans << endl;
}
}
}
y_1