結果
| 問題 |
No.3116 More and more teleporter
|
| コンテスト | |
| ユーザー |
Tatsu_mr
|
| 提出日時 | 2025-04-27 17:41:52 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 79 ms / 2,000 ms |
| コード長 | 4,136 bytes |
| コンパイル時間 | 3,254 ms |
| コンパイル使用メモリ | 279,636 KB |
| 実行使用メモリ | 11,380 KB |
| 最終ジャッジ日時 | 2025-04-27 17:41:58 |
| 合計ジャッジ時間 | 6,165 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define For(i, a, b) for(int i = (a); i < (b); i++)
#define rep(i, n) For(i, 0, n)
#define rFor(i, a, b) for(int i = (a); i >= (b); i--)
#define ALL(v) (v).begin(), (v).end()
#define rALL(v) (v).rbegin(), (v).rend()
#define SZ(v) ((int)(v).size())
using lint = long long;
using ld = long double;
int INF = 2000000000;
lint LINF = 1000000000000000000;
struct SetupIo {
SetupIo() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(15);
cerr << fixed << setprecision(15);
}
} setupio;
template <class S, S (*op)(S, S), S (*e)()>
struct SegmentTree {
private:
int n, sz, lg;
vector<S> d;
void build() {
while (sz < n) {
sz *= 2, lg++;
}
d.resize(sz * 2, e());
}
void update(int k) {
d[k] = op(d[k << 1], d[k << 1 | 1]);
}
public:
SegmentTree() {}
SegmentTree(int n_) : n(n_), sz(1), lg(0) { build(); }
SegmentTree(vector<S> &a) : n(a.size()), sz(1), lg(0) {
build();
for (int i = 0; i < n; i++) { d[i + sz] = a[i]; }
for (int i = sz - 1; i >= 1; i--) { update(i); }
}
void set(int p, S x) {
assert(0 <= p && p < n);
p += sz;
d[p] = x;
for (int i = 1; i <= lg; i++) {
update(p >> i);
}
}
S get(int p) const {
assert(0 <= p && p < n);
return d[p + sz];
}
S prod(int l, int r) const {
assert(0 <= l && l <= r && r <= n);
S sml = e(), smr = e();
l += sz, r += sz;
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);
}
S all_prod() const { return d[1]; }
template <bool (*f)(S)>
int max_right(int l) const {
return max_right(l, [](S x) { return f(x); });
}
template <class F>
int max_right(int l, F f) const {
assert(0 <= l && l <= n);
assert(f(e()));
if (l == n) { return n; }
l += sz;
S sm = e();
do {
while (l % 2 == 0) { l >>= 1; }
if (!f(op(sm, d[l]))) {
while (l < sz) {
l = (2 * l);
if (f(op(sm, d[l]))) {
sm = op(sm, d[l]);
l++;
}
}
return l - sz;
}
sm = op(sm, d[l]);
l++;
} while ((l & -l) != l);
return n;
}
template <bool (*f)(S)> int min_left(int r) const {
return min_left(r, [](S x) { return f(x); });
}
template <class F> int min_left(int r, F f) const {
assert(0 <= r && r <= n);
assert(f(e()));
if (r == 0) { return 0; }
r += sz;
S sm = e();
do {
r--;
while (r > 1 && (r % 2)) { r >>= 1; }
if (!f(op(d[r], sm))) {
while (r < sz) {
r = (2 * r + 1);
if (f(op(d[r], sm))) {
sm = op(d[r], sm);
r--;
}
}
return r + 1 - sz;
}
sm = op(d[r], sm);
} while ((r & -r) != r);
return 0;
}
};
lint op(lint a, lint b) { return min(a, b); }
lint e() { return LINF; }
int main() {
int n, q;
cin >> n >> q;
SegmentTree<lint, op, e> l(n), r(n);
rep(_, q) {
int t;
cin >> t;
if (t == 1) {
lint x;
cin >> x;
x--;
lint ans1 = x;
lint ans2 = l.prod(0, x + 1) + x;
lint ans3 = r.prod(x, n) - x;
cout << min({ans1, ans2, ans3}) << "\n";
} else {
lint x, c;
cin >> x >> c;
x--;
if (c - x < l.get(x)) {
l.set(x, c - x);
}
if (c + x < r.get(x)) {
r.set(x, c + x);
}
}
}
}
Tatsu_mr