library_checker/data_structure/
point_add_range_sum.rs1use competitive::prelude::*;
2use competitive::{
3 algebra::AdditiveOperation,
4 data_structure::{BinaryIndexedTree, SegmentTree},
5};
6
7competitive::define_enum_scan! {
8 enum Query: usize {
9 0 => Add { p: usize, x: i64 }
10 1 => Sum { l: usize, r: usize }
11 }
12}
13
14#[verify::library_checker("point_add_range_sum")]
15pub fn point_add_range_sum_binary_indexed_tree(reader: impl Read, writer: impl Write) {
16 prepare_io!(reader, writer);
17 sc!(n, q, a: [i64; iter n]);
18 let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::new(n);
19 for (i, a) in a.enumerate() {
20 bit.update(i, a);
21 }
22 for _ in 0..q {
23 sc!(query: Query);
24 match query {
25 Query::Add { p, x } => {
26 bit.update(p, x);
27 }
28 Query::Sum { l, r } => {
29 pp!(bit.fold(l, r));
30 }
31 }
32 }
33}
34
35#[verify::library_checker("point_add_range_sum")]
36pub fn point_add_range_sum_segment_tree(reader: impl Read, writer: impl Write) {
37 prepare_io!(reader, writer);
38 sc!(n, q, a: [i64; n]);
39 let mut seg = SegmentTree::<AdditiveOperation<_>>::from_vec(a);
40 for _ in 0..q {
41 sc!(query: Query);
42 match query {
43 Query::Add { p, x } => {
44 seg.update(p, x);
45 }
46 Query::Sum { l, r } => {
47 pp!(seg.fold(l..r));
48 }
49 }
50 }
51}