結果
| 問題 |
No.3116 More and more teleporter
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-20 12:05:49 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,228 bytes |
| コンパイル時間 | 2,008 ms |
| コンパイル使用メモリ | 167,348 KB |
| 実行使用メモリ | 14,232 KB |
| 最終ジャッジ日時 | 2025-04-20 12:05:54 |
| 合計ジャッジ時間 | 3,853 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 WA * 14 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = 1LL << 60;
struct SegmentTree {
int n;
vector<pair<ll, ll>> tree;
SegmentTree(int _n) : n(_n), tree(4 * _n, {INF, INF}) {}
void update(int idx, ll val, int node = 1, int start = 1, int end = -1) {
if (end == -1) end = n;
if (start == end) {
tree[node] = {val + start, val - start};
return;
}
int mid = (start + end) / 2;
if (idx <= mid)
update(idx, val, node * 2, start, mid);
else
update(idx, val, node * 2 + 1, mid + 1, end);
tree[node] = {min(tree[node * 2].first, tree[node * 2 + 1].first),
min(tree[node * 2].second, tree[node * 2 + 1].second)};
}
pair<ll, ll> query(int left, int right, int node = 1, int start = 1, int end = -1) {
if (end == -1) end = n;
if (left > end || right < start) return {INF, INF};
if (left <= start && end <= right) return tree[node];
int mid = (start + end) / 2;
auto left_res = query(left, right, node * 2, start, mid);
auto right_res = query(left, right, node * 2 + 1, mid + 1, end);
return {min(left_res.first, right_res.first),
min(left_res.second, right_res.second)};
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, Q;
cin >> N >> Q;
SegmentTree seg_tree(N);
for (int q = 0; q < Q; ++q) {
int type;
cin >> type;
if (type == 1) {
int x;
cin >> x;
ll min_cost = (ll)(x - 1);
if (x > 1) {
auto res = seg_tree.query(1, x - 1);
if (res.second != INF) {
min_cost = min(min_cost, res.second + x);
}
}
if (x <= N) {
auto res = seg_tree.query(x, N);
if (res.first != INF) {
min_cost = min(min_cost, res.first - x);
}
}
cout << min_cost << '\n';
} else {
int x, c;
cin >> x >> c;
seg_tree.update(x, c);
}
}
return 0;
}