結果
問題 |
No.3116 More and more teleporter
|
ユーザー |
![]() |
提出日時 | 2025-04-19 09:33:55 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 107 ms / 2,000 ms |
コード長 | 1,879 bytes |
コンパイル時間 | 3,722 ms |
コンパイル使用メモリ | 281,208 KB |
実行使用メモリ | 11,496 KB |
最終ジャッジ日時 | 2025-04-19 09:34:02 |
合計ジャッジ時間 | 5,428 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include<bits/stdc++.h> using namespace std; using ll = long long; const int iinf = 1e9; const ll inf = 1e18; template<typename T> ostream& operator<<(ostream &o, vector<T> v) { for (int i = 0; i < v.size(); i++) o << v[i] << (i+1<v.size()?" ":""); return o; } template <typename T> struct SegTree { using F = function<T(T, T)>; int n; F f; T ti; vector<T> dat; SegTree() {} SegTree(F f, T ti,int num) : f(f), ti(ti) { n = max(__bit_ceil(num), 1); dat.assign(n << 1, ti); } SegTree(F f,T ti,vector<T>&v):SegTree(f,ti,v.size()){ for (int i = 0; i < v.size(); i++) dat[n + i] = v[i]; for(int i=n-1;i;i--) dat[i]=f(dat[i*2], dat[i*2+1]); } void set_val(int k, T x) { dat[k += n] = x; while(k >>= 1) dat[k] = f(dat[k*2], dat[k*2+1]); } T query(int a, int b) { if (a >= b) return ti; T vl = ti, vr = ti; for (int l=a+n, r=b+n; l<r; l>>=1, r>>=1) { if (l & 1) vl = f(vl, dat[l++]); if (r & 1) vr = f(dat[--r], vr); } return f(vl, vr); } }; struct Edge { int to; ll cost; }; int main() { cin.tie(0)->sync_with_stdio(false); int N, Q; cin >> N >> Q; SegTree<ll> segL([&](ll a, ll b) { return min(a, b); }, inf, N); SegTree<ll> segR([&](ll a, ll b) { return min(a, b); }, inf, N); while(Q--){ int type, x; cin >> type >> x; x--; if(type == 1){ ll ans = x; ll t1 = segL.query(0, x) + x; ll t2 = segR.query(x, N) - x; ans = min({ans, t1, t2}); cout << ans << "\n"; } else { ll c; cin >> c; segL.set_val(x, min(segL.query(x,x+1), c - x)); segR.set_val(x, min(segR.query(x,x+1), c + x)); } } return 0; }