This documentation is automatically generated by competitive-verifier/competitive-verifier
// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/staticrmq
// clang-format on
#include <algorithm>
#include <iostream>
#include <vector>
#include "../../structure/others/disjoint-sparse-table.hpp"
using namespace std;
int main() {
int N, Q;
cin >> N >> Q;
vector<int> A(N);
for (int& a : A) cin >> a;
auto f = [](int a, int b) { return min(a, b); };
auto st = get_disjoint_sparse_table(A, f);
while (Q--) {
int l, r;
cin >> l >> r;
cout << st.fold(l, r) << "\n";
}
}
#line 1 "test/verify/yosupo-staticrmq-2.test.cpp"
// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/staticrmq
// clang-format on
#include <algorithm>
#include <iostream>
#include <vector>
#line 2 "structure/others/disjoint-sparse-table.hpp"
#line 5 "structure/others/disjoint-sparse-table.hpp"
/**
* @brief Disjoint-Sparse-Table
*
*/
template <typename Semigroup, typename F>
struct DisjointSparseTable {
const F f;
std::vector<std::vector<Semigroup>> st;
std::vector<int> lookup;
DisjointSparseTable(const std::vector<Semigroup>& v, const F& f) : f(f) {
const int n = (int)v.size();
int b = 0;
while ((1 << b) <= n) ++b;
st.resize(b, std::vector<Semigroup>(n, Semigroup()));
for (int i = 0; i < n; i++) st[0][i] = v[i];
for (int i = 1; i < b; i++) {
int shift = 1 << i;
for (int j = 0; j < n; j += shift << 1) {
int t = std::min(j + shift, n);
st[i][t - 1] = v[t - 1];
for (int k = t - 2; k >= j; k--) st[i][k] = f(v[k], st[i][k + 1]);
if (n <= t) break;
st[i][t] = v[t];
int r = std::min(t + shift, n);
for (int k = t + 1; k < r; k++) st[i][k] = f(st[i][k - 1], v[k]);
}
}
lookup.resize(1 << b);
for (int i = 2; i < (1 << b); i++) {
lookup[i] = lookup[i >> 1] + 1;
}
}
Semigroup fold(int l, int r) {
if (l >= --r) return st[0][l];
int p = lookup[l ^ r];
return f(st[p][l], st[p][r]);
}
};
template <typename SemiGroup, typename F>
DisjointSparseTable<SemiGroup, F> get_disjoint_sparse_table(
const std::vector<SemiGroup>& v, const F& f) {
return {v, f};
}
#line 10 "test/verify/yosupo-staticrmq-2.test.cpp"
using namespace std;
int main() {
int N, Q;
cin >> N >> Q;
vector<int> A(N);
for (int& a : A) cin >> a;
auto f = [](int a, int b) { return min(a, b); };
auto st = get_disjoint_sparse_table(A, f);
while (Q--) {
int l, r;
cin >> l >> r;
cout << st.fold(l, r) << "\n";
}
}
| Env | Name | Status | Elapsed | Memory |
|---|---|---|---|---|
| g++ | example_00 |
|
2 ms | 4 MB |
| g++ | max_random_00 |
|
646 ms | 45 MB |
| g++ | max_random_01 |
|
654 ms | 45 MB |
| g++ | max_random_02 |
|
662 ms | 45 MB |
| g++ | max_random_03 |
|
685 ms | 45 MB |
| g++ | max_random_04 |
|
579 ms | 45 MB |
| g++ | random_00 |
|
463 ms | 36 MB |
| g++ | random_01 |
|
497 ms | 42 MB |
| g++ | random_02 |
|
390 ms | 7 MB |
| g++ | random_03 |
|
114 ms | 39 MB |
| g++ | random_04 |
|
146 ms | 27 MB |
| g++ | small_00 |
|
3 ms | 4 MB |
| g++ | small_01 |
|
2 ms | 4 MB |
| g++ | small_02 |
|
2 ms | 4 MB |
| g++ | small_03 |
|
2 ms | 4 MB |
| g++ | small_04 |
|
2 ms | 4 MB |
| g++ | small_05 |
|
2 ms | 4 MB |
| g++ | small_06 |
|
2 ms | 4 MB |
| g++ | small_07 |
|
2 ms | 4 MB |
| g++ | small_08 |
|
2 ms | 4 MB |
| g++ | small_09 |
|
3 ms | 4 MB |
| g++ | small_values_00 |
|
519 ms | 45 MB |
| g++ | small_width_query_00 |
|
601 ms | 45 MB |
| g++ | small_width_query_01 |
|
653 ms | 45 MB |
| g++ | small_width_query_02 |
|
655 ms | 45 MB |
| g++ | small_width_query_03 |
|
673 ms | 45 MB |
| g++ | small_width_query_04 |
|
665 ms | 45 MB |
| clang++ | example_00 |
|
2 ms | 4 MB |
| clang++ | max_random_00 |
|
612 ms | 45 MB |
| clang++ | max_random_01 |
|
603 ms | 45 MB |
| clang++ | max_random_02 |
|
586 ms | 45 MB |
| clang++ | max_random_03 |
|
638 ms | 45 MB |
| clang++ | max_random_04 |
|
595 ms | 45 MB |
| clang++ | random_00 |
|
562 ms | 36 MB |
| clang++ | random_01 |
|
551 ms | 42 MB |
| clang++ | random_02 |
|
371 ms | 7 MB |
| clang++ | random_03 |
|
118 ms | 39 MB |
| clang++ | random_04 |
|
151 ms | 27 MB |
| clang++ | small_00 |
|
3 ms | 4 MB |
| clang++ | small_01 |
|
2 ms | 4 MB |
| clang++ | small_02 |
|
2 ms | 4 MB |
| clang++ | small_03 |
|
3 ms | 4 MB |
| clang++ | small_04 |
|
2 ms | 4 MB |
| clang++ | small_05 |
|
2 ms | 4 MB |
| clang++ | small_06 |
|
2 ms | 4 MB |
| clang++ | small_07 |
|
2 ms | 4 MB |
| clang++ | small_08 |
|
2 ms | 4 MB |
| clang++ | small_09 |
|
2 ms | 4 MB |
| clang++ | small_values_00 |
|
550 ms | 45 MB |
| clang++ | small_width_query_00 |
|
679 ms | 45 MB |
| clang++ | small_width_query_01 |
|
663 ms | 45 MB |
| clang++ | small_width_query_02 |
|
640 ms | 45 MB |
| clang++ | small_width_query_03 |
|
698 ms | 45 MB |
| clang++ | small_width_query_04 |
|
672 ms | 45 MB |