Luzhiled's Library

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub ei1333/library

:heavy_check_mark: test/verify/yosupo-staticrmq.test.cpp

Depends on

Code

// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/staticrmq
// clang-format on

#include <algorithm>
#include <iostream>
#include <vector>

#include "../../structure/others/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 st = get_sparse_table(A, [](int a, int b) { return min(a, b); });
  while (Q--) {
    int l, r;
    cin >> l >> r;
    cout << st.fold(l, r) << "\n";
  }
}
#line 1 "test/verify/yosupo-staticrmq.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/sparse-table.hpp"

#line 4 "structure/others/sparse-table.hpp"

/**
 * @brief Sparse-Table(スパーステーブル)
 *
 */
template <typename T, typename F>
struct SparseTable {
  F f;
  std::vector<std::vector<T>> st;
  std::vector<int> lookup;

  SparseTable() = default;

  explicit SparseTable(const std::vector<T>& v, const F& f) : f(f) {
    const int n = (int)v.size();
    const int b = 32 - __builtin_clz(n);
    st.assign(b, std::vector<T>(n));
    for (int i = 0; i < n; i++) {
      st[0][i] = v[i];
    }
    for (int i = 1; i < b; i++) {
      for (int j = 0; j + (1 << i) <= n; j++) {
        st[i][j] = f(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
      }
    }
    lookup.resize(v.size() + 1);
    for (int i = 2; i <= n; i++) {
      lookup[i] = lookup[i >> 1] + 1;
    }
  }

  inline T fold(int l, int r) const {
    int b = lookup[r - l];
    return f(st[b][l], st[b][r - (1 << b)]);
  }
};

template <typename T, typename F>
SparseTable<T, F> get_sparse_table(const std::vector<T>& v, const F& f) {
  return SparseTable<T, F>(v, f);
}
#line 10 "test/verify/yosupo-staticrmq.test.cpp"

using namespace std;

int main() {
  int N, Q;
  cin >> N >> Q;
  vector<int> A(N);
  for (int& a : A) cin >> a;
  auto st = get_sparse_table(A, [](int a, int b) { return min(a, b); });
  while (Q--) {
    int l, r;
    cin >> l >> r;
    cout << st.fold(l, r) << "\n";
  }
}

Test cases

Env Name Status Elapsed Memory
g++ example_00 :heavy_check_mark: AC 2 ms 4 MB
g++ max_random_00 :heavy_check_mark: AC 693 ms 44 MB
g++ max_random_01 :heavy_check_mark: AC 689 ms 44 MB
g++ max_random_02 :heavy_check_mark: AC 760 ms 45 MB
g++ max_random_03 :heavy_check_mark: AC 776 ms 45 MB
g++ max_random_04 :heavy_check_mark: AC 715 ms 45 MB
g++ random_00 :heavy_check_mark: AC 494 ms 35 MB
g++ random_01 :heavy_check_mark: AC 597 ms 41 MB
g++ random_02 :heavy_check_mark: AC 369 ms 7 MB
g++ random_03 :heavy_check_mark: AC 154 ms 39 MB
g++ random_04 :heavy_check_mark: AC 204 ms 26 MB
g++ small_00 :heavy_check_mark: AC 2 ms 4 MB
g++ small_01 :heavy_check_mark: AC 3 ms 4 MB
g++ small_02 :heavy_check_mark: AC 3 ms 4 MB
g++ small_03 :heavy_check_mark: AC 2 ms 4 MB
g++ small_04 :heavy_check_mark: AC 3 ms 4 MB
g++ small_05 :heavy_check_mark: AC 2 ms 4 MB
g++ small_06 :heavy_check_mark: AC 3 ms 4 MB
g++ small_07 :heavy_check_mark: AC 2 ms 4 MB
g++ small_08 :heavy_check_mark: AC 3 ms 4 MB
g++ small_09 :heavy_check_mark: AC 2 ms 4 MB
g++ small_values_00 :heavy_check_mark: AC 615 ms 44 MB
g++ small_width_query_00 :heavy_check_mark: AC 625 ms 44 MB
g++ small_width_query_01 :heavy_check_mark: AC 633 ms 44 MB
g++ small_width_query_02 :heavy_check_mark: AC 591 ms 44 MB
g++ small_width_query_03 :heavy_check_mark: AC 684 ms 44 MB
g++ small_width_query_04 :heavy_check_mark: AC 617 ms 45 MB
clang++ example_00 :heavy_check_mark: AC 2 ms 4 MB
clang++ max_random_00 :heavy_check_mark: AC 621 ms 45 MB
clang++ max_random_01 :heavy_check_mark: AC 611 ms 45 MB
clang++ max_random_02 :heavy_check_mark: AC 636 ms 45 MB
clang++ max_random_03 :heavy_check_mark: AC 612 ms 45 MB
clang++ max_random_04 :heavy_check_mark: AC 626 ms 45 MB
clang++ random_00 :heavy_check_mark: AC 501 ms 35 MB
clang++ random_01 :heavy_check_mark: AC 537 ms 42 MB
clang++ random_02 :heavy_check_mark: AC 334 ms 7 MB
clang++ random_03 :heavy_check_mark: AC 129 ms 39 MB
clang++ random_04 :heavy_check_mark: AC 182 ms 26 MB
clang++ small_00 :heavy_check_mark: AC 3 ms 4 MB
clang++ small_01 :heavy_check_mark: AC 3 ms 4 MB
clang++ small_02 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_03 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_04 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_05 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_06 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_07 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_08 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_09 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_values_00 :heavy_check_mark: AC 561 ms 45 MB
clang++ small_width_query_00 :heavy_check_mark: AC 629 ms 44 MB
clang++ small_width_query_01 :heavy_check_mark: AC 630 ms 45 MB
clang++ small_width_query_02 :heavy_check_mark: AC 685 ms 44 MB
clang++ small_width_query_03 :heavy_check_mark: AC 604 ms 44 MB
clang++ small_width_query_04 :heavy_check_mark: AC 627 ms 45 MB
Back to top page