結果
| 問題 |
No.3116 More and more teleporter
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-20 19:14:47 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 66 ms / 2,000 ms |
| コード長 | 1,203 bytes |
| コンパイル時間 | 1,780 ms |
| コンパイル使用メモリ | 164,464 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-04-20 19:14:51 |
| 合計ジャッジ時間 | 3,780 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (1LL<<60);
struct Fenwick {
int n;
vector<ll> t;
Fenwick(int _n): n(_n), t(n+1, INF) {}
// i∈[1..n] の点更新: t[i] = min(t[i], v)
void update(int i, ll v) {
for(; i<=n; i+=i&-i)
t[i] = min(t[i], v);
}
// 1..i の最小値を返す
ll query(int i) {
ll r = INF;
for(; i>0; i-=i&-i)
r = min(r, t[i]);
return r;
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, Q;
cin >> N >> Q;
Fenwick bit1(N), bit2(N);
while(Q--){
int type;
cin >> type;
if(type == 1){
int x;
cin >> x;
ll ans = x - 1; // 直接歩くコスト
ll bmin = bit1.query(x);
if(bmin < INF) ans = min(ans, (ll)x + bmin);
// 逆向きはインデックスを反転して同じクエリ
int rx = N - x + 1;
ll dmin = bit2.query(rx);
if(dmin < INF) ans = min(ans, - (ll)x + dmin);
cout << ans << "\n";
} else {
int x; ll c;
cin >> x >> c;
// x→反転インデックス
int rx = N - x + 1;
bit1.update(x, c - x);
bit2.update(rx, c + x);
}
}
return 0;
}