結果
問題 |
No.3122 Median of Medians of Division
|
ユーザー |
|
提出日時 | 2025-04-19 16:03:08 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,276 ms / 2,000 ms |
コード長 | 3,266 bytes |
コンパイル時間 | 3,798 ms |
コンパイル使用メモリ | 291,928 KB |
実行使用メモリ | 36,756 KB |
最終ジャッジ日時 | 2025-04-19 16:03:57 |
合計ジャッジ時間 | 41,231 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 40 |
ソースコード
/* import typing def _ceil_pow2(n: int) -> int: x = 0 while (1 << x) < n: x += 1 return x def _bsf(n: int) -> int: x = 0 while n % 2 == 0: x += 1 n //= 2 return x class SegTree: def __init__(self, op, e, v): ... def set(self, p, x): ... def get(self, p): ... def prod(self, left, right): ... def all_prod(self): ... def max_right(self, left, f): ... def min_left(self, right, f): ... def _update(self, k): ... def op(x, y): return sorted(x+y)[2:] N, Q = map(int, input().split()) A = list(map(int, input().split())) A = [0] + A + [0] seg = SegTree(op, [-(1<<60), -(1<<60)], N+1) for i in range(N+1): seg.set(i, [min(A[i], A[i+1]), -(1<<60)]) for i in range(Q): t, x, y = map(int, input().split()) if t == 1: A[x] = y seg.set(x-1, [min(A[x-1], A[x]), -(1<<60)]) seg.set(x, [min(A[x], A[x+1]), -(1<<60)]) else: print(op(seg.prod(x, y), [A[x], A[y]])[0]) */ #include <bits/stdc++.h> using namespace std; using ll = long long; using P = pair<ll, ll>; using V = vector<ll>; int _ceil_pow2(int n) { int x = 0; while ((1 << x) < n) x++; return x; } struct SegTree { using F = function<V(const V&, const V&)>; int _n, _size, _log; vector<V> _d; F _op; V _e; SegTree(F op, V e, int n) : _op(op), _e(e) { _n = n; _log = _ceil_pow2(n); _size = 1 << _log; _d.assign(2 * _size, _e); } void set(int p, V x) { assert(0 <= p && p < _n); p += _size; _d[p] = x; for (int i = 1; i <= _log; ++i) _update(p >> i); } V get(int p) { assert(0 <= p && p < _n); return _d[p + _size]; } V prod(int l, int r) { assert(0 <= l && l <= r && r <= _n); V sml = _e, smr = _e; l += _size; r += _size; while (l < r) { if (l & 1) sml = _op(sml, _d[l++]); if (r & 1) smr = _op(_d[--r], smr); l >>= 1; r >>= 1; } return _op(sml, smr); } V all_prod() { return _d[1]; } void _update(int k) { _d[k] = _op(_d[2 * k], _d[2 * k + 1]); } }; V op(const V& x, const V& y) { vector<ll> merged = x; merged.insert(merged.end(), y.begin(), y.end()); sort(merged.begin(), merged.end()); merged.erase(merged.begin(), merged.begin() + 2); return merged; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; vector<ll> A(N + 2); for (int i = 1; i <= N; ++i) cin >> A[i]; V identity = {-(1LL << 60), -(1LL << 60)}; SegTree seg(op, identity, N + 1); for (int i = 0; i <= N; ++i) { seg.set(i, {min(A[i], A[i + 1]), -(1LL << 60)}); } for (int q = 0; q < Q; ++q) { int t, x, y; cin >> t >> x >> y; if (t == 1) { A[x] = y; seg.set(x - 1, {min(A[x - 1], A[x]), -(1LL << 60)}); seg.set(x, {min(A[x], A[x + 1]), -(1LL << 60)}); } else { V res = op(seg.prod(x, y), {A[x], A[y]}); cout << res[0] << '\n'; } } return 0; }