View on GitHub

cp-library

セグメント木

C++ 用ライブラリ一覧に戻る

ソースコード

nachia/array/segtree.hpp

主な機能

モノイドの要素列を二分木で管理することで、要素を 1 つ書き換える変更と、任意の区間の集約値の取得を高速に処理できる。

AtCoder Library との違いは、単位元 e をテンプレート引数ではなくコンストラクタで設定することである。

以下、 op による集約を $+$ で表す。つまり $a+b=\text{op}(a,b)$ 。

構造体テンプレート Segtree

テンプレート引数

template<
    class S,
    S op(S l, S r)
>
struct Segtree;

要素の型 S と、集約の演算 op を与える。

以降、 S の要素のコピーは $O(1)$ 時間で行えるとする。

コンストラクタ

Segtree();    // (0)
Segtree(int n, S e);   // (1)
Segtree(const std::vector<S>& a, S e);   // (2)

set

void set(int p, S x);

単一の要素への操作。 a[p] = x に相当する。

get

S get(int p) const;

a[p] を取得する。

prod

S prod(int l, int r) const;

$a[l]+a[l+1]+\cdots +a[r-1]$ を返す。 $l=r$ ならば $e$ を返す。

allProd

S allProd() const;

$a[0]+a[1]+\cdots +a[n-1]$ を返す。 $n=0$ ならば $e$ を返す。

minLeft

template<class E>
int minLeft(int r, E cmp);

セグメント木上の二分探索によって、以下の条件をすべて満たすような整数 $l$ を一つ求める。

maxRight

template<class E>
int maxRight(int l, E cmp);

セグメント木上の二分探索によって、以下の条件をすべて満たすような整数 $r$ を一つ求める。


TOP PAGE