No.121

最初に を座標圧縮しておく.

3つ組の真ん中の要素 を固定したときの門松列を数え上げ, まで動かす.

真ん中の要素を固定したときの左右の高さが同じでも構わないとした場合の門松列の数を数える.

これは左右がともに より大きいか, ともに より大きい組み合わせの数となる.

となる の数を , となる の数を とすると, 左右がともに より小さい組み合わせの数は となる. ともに大きい場合も同様に計算する.

は Binary Indexed Tree を使えば を動かしても高速に計算できる.

ここから左右の高さが同じ組み合わせの数 を引く. を動かしたときに差分更新できる.

このままだと3つとも同じ高さになる組み合わせを引きすぎているので, 最後にこれを追加する.