2. ウェーブレット行列 ウェーブレット行列とは、長さ $n$ の 1次元の $b$ bit 整数配列に対して、$O(nb)$ の時間の前処理を行うことで以下のような区間クエリを求められるデータ構造です。 Quantile(L, R, k) : 配列の区間 $[L, R)$ の中で、$k$ 番目に小さい値を答える RangeFreq(L, R, x, y) : 配列の区間 $[L, R)$ の中で、値域が $[x, y)$ の要素数を答える 単純に考えると、どちらの操作も計算量は $O(R-L)$ になりそうですが、ウェーブレット行列はこれらのクエリを、区間の長さや中身、答えにかかわらず $O(b)$ の時間で答えることができます。 更に、メモリ使用量に関しても十分省メモリに実装することができ、真面目に実装すると $nb + o(nb)$ [bit] のスペース、つまりもともとの数列を表す