結果
| 問題 | No.875 Range Mindex Query |
| コンテスト | |
| ユーザー |
lowr
|
| 提出日時 | 2019-09-07 16:23:37 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 328 ms / 2,000 ms |
| コード長 | 2,446 bytes |
| 記録 | |
| コンパイル時間 | 2,320 ms |
| コンパイル使用メモリ | 202,544 KB |
| 最終ジャッジ日時 | 2025-01-07 17:10:50 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
using i64 = long long;
template <typename T, typename F>
class SegmentTree {
int size;
T id;
T *dat;
F f;
T query_impl(const int a, const int b, const int k, const int l, const int r) const {
if (r <= a || b <= l) return id;
if (a <= l && r <= b) return dat[k];
return f(query_impl(a, b, k * 2 + 1, l, (l + r) / 2),
query_impl(a, b, k * 2 + 2, (l + r) / 2, r));
}
public:
SegmentTree(const int n, const T &id, const F f) : id(id), f(f) {
size = 2;
while (size < n) size *= 2;
dat = new T[2 * size - 1];
for (int i = 0; i < 2 * size - 1; i++) dat[i] = id;
}
template <template <class> class Container>
SegmentTree(const Container<T> &v, const T &id, const F f) : id(id), f(f) {
size = 2;
int n = v.size();
while (size < n) size *= 2;
dat = new T[2 * size - 1];
for (int i = size - 1; i < size - 1 + n; i++) dat[i] = v[i - size + 1];
for (int i = size - 1 + n; i < 2 * size - 1; i++) dat[i] = id;
dig(0);
}
void dig(int v) {
if (v >= size - 1) return;
dig(2 * v + 1);
dig(2 * v + 2);
dat[v] = f(dat[2 * v + 1], dat[2 * v + 2]);
}
~SegmentTree() {
delete[] dat;
}
void update(int i, const T x) {
i += size - 1;
dat[i] = x;
while (i > 0) {
i = (i - 1) / 2;
dat[i] = f(dat[i * 2 + 1], dat[i * 2 + 2]);
}
}
T query(const int a, const int b) const {
return query_impl(a, b, 0, 0, size);
}
T operator[](const int i) const {
return dat[i + size - 1];
}
};
int main() {
int n, q;
std::cin >> n >> q;
std::vector<std::pair<int, int>> a;
for (int i = 0; i < n; i++) {
int in;
std::cin >> in;
a.emplace_back(in, i);
}
auto st = SegmentTree(a, std::make_pair(1000000, 0), [](const auto &lhs, const auto &rhs) {
return std::min(lhs, rhs);
});
while (q--) {
int t, l, r;
std::cin >> t >> l >> r;
if (t == 1) {
l--; r--;
std::swap(a[l].first, a[r].first);
st.update(l, std::make_pair(a[l].first, l));
st.update(r, std::make_pair(a[r].first, r));
} else {
std::cout << st.query(l - 1, r).second + 1 << std::endl;
}
}
return 0;
}
lowr