Skip to main content

library_checker/data_structure/
point_set_range_composite.rs

1use competitive::prelude::*;
2use competitive::{
3    algebra::LinearOperation, data_structure::SegmentTree, num::mint_basic::MInt998244353 as M,
4};
5
6competitive::define_enum_scan! {
7    enum Query: usize {
8        0 => Set { p: usize, cd: (M, M) }
9        1 => Apply { l: usize, r: usize, x: M }
10    }
11}
12
13#[verify::library_checker("point_set_range_composite")]
14pub fn point_set_range_composite(reader: impl Read, writer: impl Write) {
15    prepare_io!(reader, writer);
16    sc!(n, q, ab: [(M, M); n]);
17    let mut seg = SegmentTree::<LinearOperation<_>>::from_vec(ab);
18    for _ in 0..q {
19        sc!(query: Query);
20        match query {
21            Query::Set { p, cd } => {
22                seg.set(p, cd);
23            }
24            Query::Apply { l, r, x } => {
25                let (a, b) = seg.fold(l..r);
26                pp!(a * x + b);
27            }
28        }
29    }
30}