Skip to main content

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}