library_checker/data_structure/deque_operate_all_composite.rs
1use competitive::prelude::*;
2use competitive::{
3 algebra::LinearOperation, data_structure::DequeAggregation, num::mint_basic::MInt998244353 as M,
4};
5
6competitive::define_enum_scan! {
7 enum Query: usize {
8 0 => PushFront { ab: (M, M) }
9 1 => PushBack { ab: (M, M) }
10 2 => PopFront
11 3 => PopBack
12 4 => Apply { x: M }
13 }
14}
15
16#[verify::library_checker("deque_operate_all_composite")]
17pub fn deque_operate_all_composite(reader: impl Read, writer: impl Write) {
18 prepare_io!(reader, writer);
19 sc!(q);
20 let mut deq = DequeAggregation::<LinearOperation<_>>::new();
21 for _ in 0..q {
22 sc!(query: Query);
23 match query {
24 Query::PushFront { ab } => {
25 deq.push_front(ab);
26 }
27 Query::PushBack { ab } => {
28 deq.push_back(ab);
29 }
30 Query::PopFront => {
31 deq.pop_front();
32 }
33 Query::PopBack => {
34 deq.pop_back();
35 }
36 Query::Apply { x } => {
37 let (a, b) = deq.fold_all();
38 pp!(a * x + b);
39 }
40 }
41 }
42}