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-2.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/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";
  }
}

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 646 ms 45 MB
g++ max_random_01 :heavy_check_mark: AC 654 ms 45 MB
g++ max_random_02 :heavy_check_mark: AC 662 ms 45 MB
g++ max_random_03 :heavy_check_mark: AC 685 ms 45 MB
g++ max_random_04 :heavy_check_mark: AC 579 ms 45 MB
g++ random_00 :heavy_check_mark: AC 463 ms 36 MB
g++ random_01 :heavy_check_mark: AC 497 ms 42 MB
g++ random_02 :heavy_check_mark: AC 390 ms 7 MB
g++ random_03 :heavy_check_mark: AC 114 ms 39 MB
g++ random_04 :heavy_check_mark: AC 146 ms 27 MB
g++ small_00 :heavy_check_mark: AC 3 ms 4 MB
g++ small_01 :heavy_check_mark: AC 2 ms 4 MB
g++ small_02 :heavy_check_mark: AC 2 ms 4 MB
g++ small_03 :heavy_check_mark: AC 2 ms 4 MB
g++ small_04 :heavy_check_mark: AC 2 ms 4 MB
g++ small_05 :heavy_check_mark: AC 2 ms 4 MB
g++ small_06 :heavy_check_mark: AC 2 ms 4 MB
g++ small_07 :heavy_check_mark: AC 2 ms 4 MB
g++ small_08 :heavy_check_mark: AC 2 ms 4 MB
g++ small_09 :heavy_check_mark: AC 3 ms 4 MB
g++ small_values_00 :heavy_check_mark: AC 519 ms 45 MB
g++ small_width_query_00 :heavy_check_mark: AC 601 ms 45 MB
g++ small_width_query_01 :heavy_check_mark: AC 653 ms 45 MB
g++ small_width_query_02 :heavy_check_mark: AC 655 ms 45 MB
g++ small_width_query_03 :heavy_check_mark: AC 673 ms 45 MB
g++ small_width_query_04 :heavy_check_mark: AC 665 ms 45 MB
clang++ example_00 :heavy_check_mark: AC 2 ms 4 MB
clang++ max_random_00 :heavy_check_mark: AC 612 ms 45 MB
clang++ max_random_01 :heavy_check_mark: AC 603 ms 45 MB
clang++ max_random_02 :heavy_check_mark: AC 586 ms 45 MB
clang++ max_random_03 :heavy_check_mark: AC 638 ms 45 MB
clang++ max_random_04 :heavy_check_mark: AC 595 ms 45 MB
clang++ random_00 :heavy_check_mark: AC 562 ms 36 MB
clang++ random_01 :heavy_check_mark: AC 551 ms 42 MB
clang++ random_02 :heavy_check_mark: AC 371 ms 7 MB
clang++ random_03 :heavy_check_mark: AC 118 ms 39 MB
clang++ random_04 :heavy_check_mark: AC 151 ms 27 MB
clang++ small_00 :heavy_check_mark: AC 3 ms 4 MB
clang++ small_01 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_02 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_03 :heavy_check_mark: AC 3 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 550 ms 45 MB
clang++ small_width_query_00 :heavy_check_mark: AC 679 ms 45 MB
clang++ small_width_query_01 :heavy_check_mark: AC 663 ms 45 MB
clang++ small_width_query_02 :heavy_check_mark: AC 640 ms 45 MB
clang++ small_width_query_03 :heavy_check_mark: AC 698 ms 45 MB
clang++ small_width_query_04 :heavy_check_mark: AC 672 ms 45 MB
Back to top page