$A_l, A_{l+1}, \ldots, A_{r-1}$ に存在する $x$ より小さい値の個数、$x$ と等しい値の個数、$x$ より大きい値の個数を順にまとめたタプルを返します。
$l = r$ のときは $(0, 0, 0)$ を返します。
$A_l, A_{l+1}, \ldots, A_{r-1}$ に存在する $x$ より小さい値の個数を返します。
$l = r$ のときは $(0, 0, 0)$ を返します。
$A_l, A_{l+1}, \ldots, A_{r-1}$ に存在する $x$ と等しい値の個数を返します。
$l = r$ のときは $(0, 0, 0)$ を返します。
$A_l, A_{l+1}, \ldots, A_{r-1}$ に存在する $x$ より大きい値の個数を返します。
$l = r$ のときは $(0, 0, 0)$ を返します。
先頭から $k$ 番目に出現する $x$ の位置 (1-indexed) を返します。
$k = 0$ または、そのような位置が存在しない場合は $N + 1$ を返します。
#include <bits/stdc++.h>
#include "DataStructure/WaveletMatrix.hpp"
using namespace std;
int main() {
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
WaveletMatrix<int, 3> wm({3, 0, 2, 3, 4, 6, 5, 7, 1, 1});
cout << "size = " << wm.size() << endl; // 10
// 3 0 2 3 4 6 5 7 1 1
for (int i = 0; i < wm.size(); ++i) cout << wm.access(i) << " \n"[i + 1 == wm.size()];
auto [lt, r, gt] = wm.rank_all(0, 7, 3); // target = [3, 0, 2, 3, 4, 6, 5]
cout << "< 3 (ans " << lt << "), = 3 (ans " << r << "), > 3 (ans " << gt << ")" << endl; // 2, 2, 3
cout << "rank_less_than(5, 8, 7) = " << wm.rank_less_than(5, 8, 7) << endl; // 2
cout << "rank(5, 8, 7) = " << wm.rank(5, 8, 7) << endl; // 1
cout << "rank_more_than(5, 8, 7) = " << wm.rank_more_than(5, 8, 7) << endl; // 0
cout << "select(1, 6) = " << wm.select(1, 6) << endl; // 6 (1-indexed)
cout << "select(2, 6) = " << wm.select(2, 6) << endl; // 11 (= N + 1) (1-indexed)
cout << "select(2, 1) = " << wm.select(2, 1) << endl; // 10
cout << "quantile(2, 10, 4) = " << wm.quantile(2, 10, 4) << endl; // 3 [1, 1, 2, 3, 4, 5, 6, 7](sorted)
cout << "range_frequency(1, 10, 2, 4) = " << wm.range_frequency(1, 10, 2, 4) << endl; // 2 [2, 3]
puts("range_min_k");
// target = [3, 0, 2, 3, 4, 6] -> [3, 3, 4]
// v = 3, frequency = 2
// v = 4, frequency = 1
for (auto [v, fq] : wm.range_min_k(0, 6, 3, 5, 2)) cout << "v = " << v << ", frequency = " << fq << endl;
puts("range_max_k");
// target = [5, 7, 1, 1] -> [5, 7, 1, 1]
// v = 7, frequency = 1
// v = 5, frequency = 1
for (auto [v, fq] : wm.range_max_k(6, 10, 0, 8, 2)) cout << "v = " << v << ", frequency = " << fq << endl;
puts("range_min_k");
// target = [1, 1] -> [1, 1]
// v = 1, frequency = 2
for (auto [v, fq] : wm.range_min_k(8, 10, 1, 2, 3)) cout << "v = " << v << ", frequency = " << fq << endl;
// idx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
// wm: 3, 0, 2, 3, 4, 6, 5, 7, 1, 1
{
// target = [0, 2, 3] -> [2, 3]
auto [v, b] = wm.next_value(1, 4, 2, 5);
cout << "next_value(1, 4, 2, 5) : " << "v = " << v << ", b = " << boolalpha << b << endl; // 2, true
}
{
// target = [0, 2, 3, 4, 6, 5] -> [3, 4, 5]
auto [v, b] = wm.prev_value(1, 7, 3, 6);
cout << "next_value(1, 7, 3, 6) : " << "v = " << v << ", b = " << boolalpha << b << endl; // 5, true
}
{
// target = [2, 3] -> []
auto [v, b] = wm.prev_value(2, 4, 0, 1);
cout << "next_value(2, 4, 0, 1) : " << "v = " << v << ", b = " << boolalpha << b << endl; // *, false
}
// target = [2, 3, 4, 6, 5, 7, 1, 1] -> [2, 3, 1, 1]
// v = 1, idx = 8
// v = 1, idx = 9
// v = 2, idx = 2
// v = 3, idx = 3
for (auto [v, idx] : wm.get_rect(2, 10, 1, 4)) cout << "v = " << v << ", idx = " << idx << endl;
}