Skip to main content

library_checker/data_structure/
range_add_range_min.rs

1use competitive::prelude::*;
2use competitive::{algebra::RangeMinRangeAdd, data_structure::LazySegmentTree};
3
4competitive::define_enum_scan! {
5    enum Query: u8 {
6        0 => Add { l: usize, r: usize, x: i64 }
7        1 => Min { l: usize, r: usize }
8    }
9}
10
11#[verify::library_checker("range_add_range_min")]
12pub fn range_add_range_min(reader: impl Read, writer: impl Write) {
13    prepare_io!(reader, writer);
14    sc!(n, q, a: [i64; iter n]);
15    let mut seg = LazySegmentTree::<RangeMinRangeAdd<i64>>::from_keys(a);
16    for _ in 0..q {
17        sc!(query: Query);
18        match query {
19            Query::Add { l, r, x } => {
20                seg.update(l..r, x);
21            }
22            Query::Min { l, r } => {
23                let ans = seg.fold(l..r);
24                pp!(ans);
25            }
26        }
27    }
28}