haar_lib/algebra/
action.rs

1//! 遅延セグメント木などに載せる構造
2pub use crate::algebra::traits::*;
3
4/// 遅延セグメント木などに載せる構造
5pub trait Action {
6    /// 範囲取得の型
7    type Output: Monoid;
8    /// 範囲更新の型
9    type Lazy: Monoid;
10
11    /// 範囲取得のモノイドの単位元を返す。
12    fn fold_id() -> Self::Output {
13        Self::Output::id()
14    }
15    /// 範囲取得のモノイドの二項演算を適用させる。
16    fn fold(a: Self::Output, b: Self::Output) -> Self::Output {
17        a.op(b)
18    }
19    /// 範囲更新のモノイドの単位元を返す。
20    fn update_id() -> Self::Lazy {
21        Self::Lazy::id()
22    }
23    /// 範囲更新のモノイドの二項演算を適用させる。
24    fn update(cur: Self::Lazy, next: Self::Lazy) -> Self::Lazy {
25        cur.op(next)
26    }
27    /// 範囲更新を範囲取得に反映させる。
28    fn convert(value: Self::Output, lazy: Self::Lazy, len: usize) -> Self::Output;
29}