library_checker/data_structure/
dynamic_sequence_range_affine_range_sum.rs1use competitive::prelude::*;
2use competitive::{
3 algebra::RangeSumRangeLinear,
4 data_structure::{ImplicitSplayTree, ImplicitTreap},
5 num::mint_basic::MInt998244353 as M,
6};
7
8competitive::define_enum_scan! {
9 enum Query: usize {
10 0 => Insert { i: usize, x: M }
11 1 => Remove { i: usize }
12 2 => Reverse { l: usize, r: usize }
13 3 => Update { l: usize, r: usize, bc: (M, M) }
14 4 => Fold { l: usize, r: usize }
15 }
16}
17
18#[verify::library_checker("dynamic_sequence_range_affine_range_sum")]
19pub fn dynamic_sequence_range_affine_range_sum(reader: impl Read, writer: impl Write) {
20 prepare_io!(reader, writer);
21 sc!(n, q, a: [M; iter n]);
22
23 let mut seq = ImplicitTreap::<RangeSumRangeLinear<M>>::with_capacity(n + q);
24 seq.extend(a);
25 for _ in 0..q {
26 sc!(query: Query);
27 match query {
28 Query::Insert { i, x } => {
29 seq.insert(i, x);
30 }
31 Query::Remove { i } => {
32 seq.remove(i);
33 }
34 Query::Reverse { l, r } => {
35 seq.reverse(l..r);
36 }
37 Query::Update { l, r, bc } => {
38 seq.update(l..r, bc);
39 }
40 Query::Fold { l, r } => {
41 pp!(seq.fold(l..r).0);
42 }
43 }
44 }
45}
46
47#[verify::library_checker("dynamic_sequence_range_affine_range_sum")]
48pub fn dynamic_sequence_range_affine_range_sum_implicit_splay_tree(
49 reader: impl Read,
50 writer: impl Write,
51) {
52 prepare_io!(reader, writer);
53 sc!(n, q, a: [M; iter n]);
54
55 let mut seq = ImplicitSplayTree::<RangeSumRangeLinear<M>>::with_capacity(n + q);
56 seq.extend(a);
57 for _ in 0..q {
58 sc!(query: Query);
59 match query {
60 Query::Insert { i, x } => {
61 seq.insert(i, x);
62 }
63 Query::Remove { i } => {
64 seq.remove(i);
65 }
66 Query::Reverse { l, r } => {
67 seq.reverse(l..r);
68 }
69 Query::Update { l, r, bc } => {
70 seq.update(l..r, bc);
71 }
72 Query::Fold { l, r } => {
73 pp!(seq.fold(l..r).0);
74 }
75 }
76 }
77}