結果
| 問題 | No.3423 Minimum Xor Query |
| コンテスト | |
| ユーザー |
Kude
|
| 提出日時 | 2026-01-11 14:45:36 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,494 bytes |
| 記録 | |
| コンパイル時間 | 4,775 ms |
| コンパイル使用メモリ | 368,144 KB |
| 実行使用メモリ | 7,980 KB |
| 最終ジャッジ日時 | 2026-01-11 14:46:04 |
| 合計ジャッジ時間 | 26,534 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 WA * 10 |
ソースコード
#include<bits/stdc++.h>
namespace {
#pragma GCC diagnostic ignored "-Wunused-function"
#include<atcoder/all>
#pragma GCC diagnostic warning "-Wunused-function"
using namespace std;
using namespace atcoder;
#define rep(i,n) for(int i = 0; i < (int)(n); i++)
#define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
template<class T> bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; } else return false; }
template<class T> bool chmin(T& a, const T& b) { if (b < a) { a = b; return true; } else return false; }
using ll = long long;
using P = pair<int,int>;
using VI = vector<int>;
using VVI = vector<VI>;
using VL = vector<ll>;
using VVL = vector<VL>;
} int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, q;
cin >> n >> q;
VI a(n);
rep(i, n) cin >> a[i];
vector<tuple<int, int, int>> qs(q);
for (auto& [t, i, x] : qs) {
cin >> t;
if (t == 1) cin >> i >> x, i--;
else cin >> i;
}
constexpr int B = 224;
VI evs(q, -1);
constexpr int INF = 1001001001;
using SEG = segtree<int, [](int x, int y) { return min(x, y); }, []() { return INF; }>;
SEG seg;
VI is;
rep(iq, q) {
if (iq % B == 0) {
is.clear();
int r = min(iq + B, q);
VVI changes(n);
for (int i = iq; i < r; i++) {
if (get<0>(qs[i]) == 1) {
changes[get<1>(qs[i])].emplace_back(i);
}
}
vector<char> state(n);
rep(i, n) state[i] = !changes[i].empty();
VI mns(n, INF);
set<int> vals;
auto get_min = [&](int x) {
int res = INF;
auto it = vals.lower_bound(x);
if (it != vals.end()) chmin(res, x ^ *it);
if (it != vals.begin()) chmin(res, x ^ *prev(it));
return res;
};
rep(i, n) {
mns[i] = get_min(a[i]);
if (changes[i].empty()) {
vals.emplace(a[i]);
} else {
is.emplace_back(i);
for (auto iq : changes[i]) {
evs[iq] = get_min(get<2>(qs[iq]));
}
}
}
seg = SEG(mns);
}
auto [t, i, x] = qs[iq];
if (t == 1) {
a[i] = x;
assert(evs[iq] >= 0);
seg.set(i, evs[iq]);
} else {
int r = i;
int ans = seg.prod(0, r);
VI vs;
for (int i : is) {
if (i >= r) break;
vs.emplace_back(a[i]);
}
sort(all(vs));
rep(i, ssize(vs) - 1) chmin(ans, vs[i] ^ vs[i+1]);
cout << ans << '\n';
}
}
}
Kude