結果
| 問題 | No.875 Range Mindex Query |
| コンテスト | |
| ユーザー |
TAISA_
|
| 提出日時 | 2019-10-21 23:19:02 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 198 ms / 2,000 ms |
| コード長 | 2,529 bytes |
| 記録 | |
| コンパイル時間 | 1,696 ms |
| コンパイル使用メモリ | 172,572 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-02 17:53:07 |
| 合計ジャッジ時間 | 3,485 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
#define all(vec) vec.begin(), vec.end()
using namespace std;
using ll = long long;
using P = pair<int, int>;
constexpr ll INF = (1LL << 30) - 1LL;
constexpr ll LINF = (1LL << 60) - 1LL;
constexpr ll MOD = 1e9 + 7;
template <typename T> void chmin(T &a, T b) { a = min(a, b); }
template <typename T> void chmax(T &a, T b) { a = max(a, b); }
template <typename T> struct Segtree {
inline T merge(const T &a, const T &b) { return min(a, b); }
inline void act(T &a, const T &b) { a = b; }
int n, e;
vector<T> dat;
Segtree(int n_, int e) : e(e) {
n = 1;
while (n < n_) {
n <<= 1;
}
dat.resize(2 * n);
}
void set(int k, const T &x) {
k += n;
act(dat[k], x);
k >>= 1;
while (k > 0) {
dat[k] = merge(dat[k << 1], dat[k << 1 | 1]);
k >>= 1;
}
}
T get(const int &a, const int &b, int k, int l, int r) {
if (b <= l || r <= a) {
return e;
}
if (a <= l && r <= b) {
return dat[k];
}
return merge(get(a, b, k << 1, l, (l + r) >> 1),
get(a, b, k << 1 | 1, (l + r) >> 1, r));
}
inline T get(const int &a, const int &b) { //[a,b)
if (a >= b) {
return e;
}
return get(a, b, 1, 0, n);
}
int find(const int &a, const int &b, const T &x, int k, int l, int r) {
if (b <= l || r <= a || dat[k] > x) {
return -1;
}
if (k >= n) {
return k - n;
}
int il = find(a, b, x, k << 1, l, (l + r) >> 1);
if (il != -1) {
return il;
}
return find(a, b, x, k << 1 | 1, (l + r) >> 1, r);
}
inline int find(const int &a, const int &b, const T &x) {
if (a >= b) {
return -1;
}
return find(a, b, x, 1, 0, n);
}
};
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int n, q;
cin >> n >> q;
vector<int> a(n);
Segtree<int> seg(n, INF);
for (int i = 0; i < n; i++) {
cin >> a[i];
seg.set(i, a[i]);
}
for (int i = 0; i < q; i++) {
int t, l, r;
cin >> t >> l >> r;
if (t == 1) {
--l;
--r;
seg.set(l, a[r]);
seg.set(r, a[l]);
swap(a[l], a[r]);
} else {
--l;
int mi = seg.get(l, r);
cout << seg.find(l, r, mi) + 1 << endl;
}
}
}
TAISA_