それぞれのモンスターについて、どの時点まで生きているかが高速に求まればよい。
クエリが与えられたとき、に(bit集合の意味で)包含されるようなすべての番号のモンスターからを引くことになる。
- であるようなクエリの総ダメージ。
- であるようなクエリの総ダメージ。
とするとき、関心があるのはで、はからゼータ変換で得られる。各クエリを処理した時点でのが配列として個分すべて求まっているとすると、それらをクエリ番号に関して二分探索することで各モンスターがどの時点まで生きているかがわかる……が、を毎回作ると間に合わない。
そこで、クエリを個ずつに分割して、個のクエリ番号に対してのみを作ることにする。 モンスターがどの分割まで生きているかを線形探索(あるいは二分探索)で調べて、そこからはモンスターが死ぬまでクエリを一つずつ見ていく。
前半の計算量はで、後半は。とすると全体の計算量はとなる。