library_checker/data_structure/
point_set_range_composite.rs1use 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}