AssignSegmentTree

Struct AssignSegmentTree 

Source
pub struct AssignSegmentTree<Query>
where Query: Monoid<Set: Clone>,
{ /* private fields */ }
Expand description

A data structure that supports range query range assign operations.

§Example

use seg_lib::{AssignSegmentTree, ops::BitXor};

/// Demonstrates how to use an [`AssignSegmentTree`] for:
/// - range XOR queries
/// - range assign updates
fn main() {
    // Initialize a segment tree with values 0..100
    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
    assert_eq!(seg.len(), 100);
    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));

    // Assign values to a range
    seg.range_assign(..50, 100);
    assert!(seg.iter().take(50).all(|e| *e == 100));

    // Query XOR over ranges
    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));

    // Assign and query a single element
    seg.point_assign(50, !0);
    assert_eq!(seg.point_query(50), &!0);
}

Implementations§

Source§

impl<Query> AssignSegmentTree<Query>
where Query: Monoid<Set: Clone>,

Source

pub fn new(n: usize) -> Self

Creates a new instance initialized with n identity elements.

If you want to initialize with specific values, use from or from_iter instead.

§Time complexity

O(N)

§Example
use seg_lib::{AssignSegmentTree, ops::LCM};

let ast = AssignSegmentTree::<LCM<i32>>::new(100);
Source

pub fn len(&self) -> usize

Returns the number of elements.

§Time complexity

O(1)

§Example
use seg_lib::{AssignSegmentTree, ops::Max};

let ast = AssignSegmentTree::<Max<i32>>::new(100);
assert_eq!(ast.len(), 100);
Examples found in repository?
examples/ex_assign.rs (line 9)
6fn main() {
7    // Initialize a segment tree with values 0..100
8    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
9    assert_eq!(seg.len(), 100);
10    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));
11
12    // Assign values to a range
13    seg.range_assign(..50, 100);
14    assert!(seg.iter().take(50).all(|e| *e == 100));
15
16    // Query XOR over ranges
17    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
18    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));
19
20    // Assign and query a single element
21    seg.point_assign(50, !0);
22    assert_eq!(seg.point_query(50), &!0);
23}
Source

pub fn iter(&mut self) -> Iter<'_, <Query as Monoid>::Set>

Returns an iterator over the elements

§Time complexity

O(N)

§Example
use seg_lib::{AssignSegmentTree, ops::Min};

let mut ast = AssignSegmentTree::<Min<i32>>::new(100);
assert!(ast.iter().all(|e| e.is_none()));
Examples found in repository?
examples/ex_assign.rs (line 10)
6fn main() {
7    // Initialize a segment tree with values 0..100
8    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
9    assert_eq!(seg.len(), 100);
10    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));
11
12    // Assign values to a range
13    seg.range_assign(..50, 100);
14    assert!(seg.iter().take(50).all(|e| *e == 100));
15
16    // Query XOR over ranges
17    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
18    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));
19
20    // Assign and query a single element
21    seg.point_assign(50, !0);
22    assert_eq!(seg.point_query(50), &!0);
23}
Source

pub fn range_assign<R>(&mut self, range: R, element: <Query as Monoid>::Set)
where R: RangeBounds<usize>,

Assigns the element over the range.

§Time complexity

O(log N)

§Example
use seg_lib::{AssignSegmentTree, ops::Add};

let mut ast = AssignSegmentTree::<Add<i32>>::from_iter(0..100);
assert_eq!(ast.range_query(..), 99 * 100 / 2);

ast.range_assign(.., 1);
assert!(ast.iter().all(|e| *e == 1))
Examples found in repository?
examples/ex_assign.rs (line 13)
6fn main() {
7    // Initialize a segment tree with values 0..100
8    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
9    assert_eq!(seg.len(), 100);
10    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));
11
12    // Assign values to a range
13    seg.range_assign(..50, 100);
14    assert!(seg.iter().take(50).all(|e| *e == 100));
15
16    // Query XOR over ranges
17    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
18    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));
19
20    // Assign and query a single element
21    seg.point_assign(50, !0);
22    assert_eq!(seg.point_query(50), &!0);
23}
Source

pub fn point_assign(&mut self, i: usize, element: <Query as Monoid>::Set)

Assign the element to the i-th node.

Does nothing if the range is empty.

§Time complexity

O(log N)

§Example
use seg_lib::{AssignSegmentTree, ops::BitOr};

let mut ast = AssignSegmentTree::<BitOr<u32>>::from(vec![0; 100]);
assert_eq!(ast.range_query(..), 0);

ast.point_assign(50, 999);
ast.point_assign(50, 99);
assert_eq!(ast.point_query(50), &99);
Examples found in repository?
examples/ex_assign.rs (line 21)
6fn main() {
7    // Initialize a segment tree with values 0..100
8    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
9    assert_eq!(seg.len(), 100);
10    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));
11
12    // Assign values to a range
13    seg.range_assign(..50, 100);
14    assert!(seg.iter().take(50).all(|e| *e == 100));
15
16    // Query XOR over ranges
17    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
18    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));
19
20    // Assign and query a single element
21    seg.point_assign(50, !0);
22    assert_eq!(seg.point_query(50), &!0);
23}
Source

pub fn range_query<R>(&mut self, range: R) -> <Query as Monoid>::Set
where R: RangeBounds<usize>,

Answers a query over the given range.

Returns the identity element if the range is empty.

Unbounded bounds are clamped to the tree’s range.

§Panics

Panics if the range is explicitly out of bounds.

§Time complexity

O(log N)

§Example
use seg_lib::{AssignSegmentTree, ops::Mul};

let mut ast = AssignSegmentTree::<Mul<i32>>::new(100);
assert_eq!(ast.range_query(..), 1);

ast.point_assign(20, 2);
ast.point_assign(30, 3);
assert_eq!(ast.range_query(..), 2 * 3);

ast.point_assign(30, 30);
assert_eq!(ast.range_query(20..=30), 2 * 30);
Examples found in repository?
examples/ex_assign.rs (line 17)
6fn main() {
7    // Initialize a segment tree with values 0..100
8    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
9    assert_eq!(seg.len(), 100);
10    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));
11
12    // Assign values to a range
13    seg.range_assign(..50, 100);
14    assert!(seg.iter().take(50).all(|e| *e == 100));
15
16    // Query XOR over ranges
17    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
18    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));
19
20    // Assign and query a single element
21    seg.point_assign(50, !0);
22    assert_eq!(seg.point_query(50), &!0);
23}
Source

pub fn point_query(&mut self, i: usize) -> &<Query as Monoid>::Set

Returns the result of a query for the i-th element.

§Panics

Panics if i is out of bounds.

§Time complexity

O(log N)

§Example
use seg_lib::{AssignSegmentTree, ops::Add};

let mut ast = AssignSegmentTree::<Add<i32>>::from_iter(0..100);
assert_eq!(ast.point_query(50), &50);

ast.range_assign(.., 0);
assert_eq!(ast.point_query(50), &0);
Examples found in repository?
examples/ex_assign.rs (line 22)
6fn main() {
7    // Initialize a segment tree with values 0..100
8    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
9    assert_eq!(seg.len(), 100);
10    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));
11
12    // Assign values to a range
13    seg.range_assign(..50, 100);
14    assert!(seg.iter().take(50).all(|e| *e == 100));
15
16    // Query XOR over ranges
17    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
18    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));
19
20    // Assign and query a single element
21    seg.point_assign(50, !0);
22    assert_eq!(seg.point_query(50), &!0);
23}

Trait Implementations§

Source§

impl<Query> Clone for AssignSegmentTree<Query>
where Query: Monoid<Set: Clone>,

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<Query> Debug for AssignSegmentTree<Query>
where Query: Monoid<Set: Clone + Debug>,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<Query> From<Vec<<Query as Monoid>::Set>> for AssignSegmentTree<Query>
where Query: Monoid<Set: Clone>,

Source§

fn from(values: Vec<<Query as Monoid>::Set>) -> Self

Converts to this type from the input type.
Source§

impl<Query> FromIterator<<Query as Monoid>::Set> for AssignSegmentTree<Query>
where Query: Monoid<Set: Clone>,

Source§

fn from_iter<T: IntoIterator<Item = <Query as Monoid>::Set>>(iter: T) -> Self

Creates a value from an iterator. Read more

Auto Trait Implementations§

§

impl<Query> Freeze for AssignSegmentTree<Query>
where <Query as Monoid>::Set: Sized,

§

impl<Query> RefUnwindSafe for AssignSegmentTree<Query>
where <Query as Monoid>::Set: Sized + RefUnwindSafe,

§

impl<Query> Send for AssignSegmentTree<Query>
where <Query as Monoid>::Set: Sized + Send,

§

impl<Query> Sync for AssignSegmentTree<Query>
where <Query as Monoid>::Set: Sized + Sync,

§

impl<Query> Unpin for AssignSegmentTree<Query>
where <Query as Monoid>::Set: Sized + Unpin,

§

impl<Query> UnwindSafe for AssignSegmentTree<Query>
where <Query as Monoid>::Set: Sized + UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.