This documentation is automatically generated by competitive-verifier/competitive-verifier
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/staticrmq
#include "../SparseTable.cpp"
int op(int a, int b) { return min(a, b); }
int e() { return INT_MAX; }
int main() {
int n, q;
cin >> n >> q;
vector<int> a(n);
for (int& x : a) cin >> x;
sparsetable<int, op, e> st(a);
while (q--) {
int l, r;
cin >> l >> r;
cout << st.query(l, r) << endl;
}
}
#line 1 "test/SparseTable.test.cpp"
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/staticrmq
#line 1 "SparseTable.cpp"
#include <bits/stdc++.h>
using namespace std;
template <class T, T (*op)(T, T), T (*e)()>
struct sparsetable {
vector<vector<T>> table;
vector<int> logtable;
sparsetable() = default;
sparsetable(vector<T> v) {
int len = 0;
while ((1 << len) <= (int)v.size()) len++;
table.assign(len, vector<T>(1 << len));
for (int i = 0; i < (int)v.size(); i++) table[0][i] = v[i];
for (int i = 1; i < len; i++) {
for (int j = 0; j + (1 << i) <= (1 << len); j++) {
table[i][j] = op(table[i - 1][j], table[i - 1][j + (1 << (i - 1))]);
}
}
logtable.resize((int)v.size() + 1);
for (int i = 2; i < (int)logtable.size(); i++) {
logtable[i] = logtable[(i >> 1)] + 1;
}
}
T query(int l, int r) {
assert(l <= r);
if (l == r) return e();
int len = logtable[r - l];
return op(table[len][l], table[len][r - (1 << len)]);
}
};
template <class T, T (*op)(T, T), T (*e)()>
struct disjointsparsetable {
vector<vector<T>> table;
vector<int> logtable;
disjointsparsetable() = default;
disjointsparsetable(vector<T> v) {
int len = 0;
while ((1 << len) <= v.size()) len++;
table.assign(len, vector<T>(1 << len, e()));
for (int i = 0; i < (int)v.size(); i++) table[0][i] = v[i];
for (int i = 1; i < len; i++) {
int shift = 1 << i;
for (int j = 0; j < (int)v.size(); j += shift << 1) {
int t = min(j + shift, (int)v.size());
table[i][t - 1] = v[t - 1];
for (int k = t - 2; k >= j; k--) table[i][k] = op(v[k], table[i][k + 1]);
if (v.size() <= t) break;
table[i][t] = v[t];
int r = min(t + shift, (int)v.size());
for (int k = t + 1; k < r; k++) table[i][k] = op(table[i][k - 1], v[k]);
}
}
logtable.resize(1 << len);
for (int i = 2; i < logtable.size(); i++) {
logtable[i] = logtable[(i >> 1)] + 1;
}
}
T query(int l, int r) {
if (l == r) return e();
if (l >= --r) return table[0][l];
int len = logtable[l ^ r];
return op(table[len][l], table[len][r]);
};
};
#line 3 "test/SparseTable.test.cpp"
int op(int a, int b) { return min(a, b); }
int e() { return INT_MAX; }
int main() {
int n, q;
cin >> n >> q;
vector<int> a(n);
for (int& x : a) cin >> x;
sparsetable<int, op, e> st(a);
while (q--) {
int l, r;
cin >> l >> r;
cout << st.query(l, r) << endl;
}
}
Env | Name | Status | Elapsed | Memory |
---|---|---|---|---|
g++ | example_00 |
![]() |
5 ms | 3 MB |
g++ | max_random_00 |
![]() |
906 ms | 48 MB |
g++ | max_random_01 |
![]() |
904 ms | 48 MB |
g++ | max_random_02 |
![]() |
923 ms | 48 MB |
g++ | max_random_03 |
![]() |
892 ms | 48 MB |
g++ | max_random_04 |
![]() |
975 ms | 48 MB |
g++ | random_00 |
![]() |
744 ms | 47 MB |
g++ | random_01 |
![]() |
759 ms | 48 MB |
g++ | random_02 |
![]() |
516 ms | 8 MB |
g++ | random_03 |
![]() |
188 ms | 48 MB |
g++ | random_04 |
![]() |
244 ms | 46 MB |
g++ | small_00 |
![]() |
6 ms | 4 MB |
g++ | small_01 |
![]() |
6 ms | 4 MB |
g++ | small_02 |
![]() |
6 ms | 4 MB |
g++ | small_03 |
![]() |
6 ms | 3 MB |
g++ | small_04 |
![]() |
6 ms | 4 MB |
g++ | small_05 |
![]() |
6 ms | 4 MB |
g++ | small_06 |
![]() |
6 ms | 4 MB |
g++ | small_07 |
![]() |
6 ms | 3 MB |
g++ | small_08 |
![]() |
6 ms | 4 MB |
g++ | small_09 |
![]() |
6 ms | 3 MB |
g++ | small_values_00 |
![]() |
805 ms | 48 MB |
g++ | small_width_query_00 |
![]() |
868 ms | 48 MB |
g++ | small_width_query_01 |
![]() |
891 ms | 48 MB |
g++ | small_width_query_02 |
![]() |
910 ms | 48 MB |
g++ | small_width_query_03 |
![]() |
892 ms | 48 MB |
g++ | small_width_query_04 |
![]() |
876 ms | 48 MB |
clang++ | example_00 |
![]() |
5 ms | 4 MB |
clang++ | max_random_00 |
![]() |
909 ms | 48 MB |
clang++ | max_random_01 |
![]() |
958 ms | 48 MB |
clang++ | max_random_02 |
![]() |
933 ms | 48 MB |
clang++ | max_random_03 |
![]() |
893 ms | 48 MB |
clang++ | max_random_04 |
![]() |
888 ms | 48 MB |
clang++ | random_00 |
![]() |
756 ms | 47 MB |
clang++ | random_01 |
![]() |
778 ms | 48 MB |
clang++ | random_02 |
![]() |
513 ms | 8 MB |
clang++ | random_03 |
![]() |
202 ms | 48 MB |
clang++ | random_04 |
![]() |
254 ms | 46 MB |
clang++ | small_00 |
![]() |
6 ms | 3 MB |
clang++ | small_01 |
![]() |
6 ms | 3 MB |
clang++ | small_02 |
![]() |
5 ms | 4 MB |
clang++ | small_03 |
![]() |
5 ms | 3 MB |
clang++ | small_04 |
![]() |
5 ms | 3 MB |
clang++ | small_05 |
![]() |
5 ms | 4 MB |
clang++ | small_06 |
![]() |
5 ms | 3 MB |
clang++ | small_07 |
![]() |
5 ms | 3 MB |
clang++ | small_08 |
![]() |
5 ms | 3 MB |
clang++ | small_09 |
![]() |
5 ms | 4 MB |
clang++ | small_values_00 |
![]() |
858 ms | 48 MB |
clang++ | small_width_query_00 |
![]() |
859 ms | 48 MB |
clang++ | small_width_query_01 |
![]() |
877 ms | 48 MB |
clang++ | small_width_query_02 |
![]() |
880 ms | 48 MB |
clang++ | small_width_query_03 |
![]() |
911 ms | 48 MB |
clang++ | small_width_query_04 |
![]() |
905 ms | 48 MB |