Submission #40680970


Source Code Expand

// -*- coding:utf-8-unix -*-
// rustup doc --std --toolchain 1.42.0
#![allow(unused_imports)]

pub fn solve<I: fastproconio::NextToken>(input: &mut I) {
    // Initialize.
    use fastproconio::*;
    #[rustfmt::skip] #[cfg(tcheck)] let tins = std::time::Instant::now();
    #[rustfmt::skip] #[cfg(tcheck)] let mut durs = Vec::with_capacity(16);
    #[rustfmt::skip] #[allow(unused_macros)] macro_rules! finput {($($r:tt)*)=>{finput_inner!{input,$($r)*}};}
    #[rustfmt::skip] #[allow(unused_macros)] macro_rules! fread {($t:tt)=>{{fread_value!(input,$t)}};}
    let mut obuf = ProconWriteBuffer::with_capacity(1 << 26);
    let mut out = std::io::stdout();
    //let mut out = std::io::BufWriter::with_capacity(out.lock(), 1 << 26);
    //let err = std::io::stderr();
    //let mut err = std::io::BufWriter::with_capacity(err.lock(), 1 << 26);
    #[rustfmt::skip] #[cfg(tcheck)] durs.push((tins.elapsed(), "initialize"));

    // Input. (Only some or no input if you want to input in parallel with the main process.)
    finput! {
        q: usize,
    }
    #[rustfmt::skip] #[cfg(tcheck)] durs.push((tins.elapsed(), "input"));

    // Main Process, Output.

    const MOD: u64 = 998244353;
    let mut s = Vec::with_capacity(q);
    s.push(1u8);
    let mut spos = 0usize;
    let mut slen = 1usize;
    let mut v = 1u64;
    let mut p10 = Vec::with_capacity(q + 1);
    p10.push(1u32);
    let mut p10_last = 1u64;

    for _ in 0..q {
        finput! {
            t: u8,
        }
        match t {
            1 => {
                finput! {
                    x: u8,
                }
                invariant!(s.len() < s.capacity());
                s.push(x);
                slen += 1;
                v = v * 10 + (x as u64);
                if v >= MOD {
                    v %= MOD;
                }
                if p10.len() < slen {
                    p10_last *= 10;
                    if p10_last >= MOD {
                        p10_last %= MOD;
                    }
                    invariant!(p10.len() < p10.capacity());
                    p10.push(p10_last as u32);
                }
            }
            2 => {
                slen -= 1;
                invariant!(spos < s.len());
                invariant!(slen < p10.len());
                v = match v.overflowing_sub(((s[spos] as u64) * (p10[slen] as u64)) % MOD) {
                    (t, false) => t,
                    (t, true) => t.wrapping_add(MOD),
                };
                spos += 1;
            }
            3 => {
                obuf.uint(v);
                obuf.lf();
            }
            _ => panic!(),
        }
    }

    obuf.write_all(&mut out);
    //std::io::Write::flush(&mut out).ok();
    #[rustfmt::skip] #[cfg(tcheck)] durs.push((tins.elapsed(), "output"));

    // Execution Time.
    #[rustfmt::skip] #[cfg(tcheck)] for (dur, s) in durs.iter() { eprintln!("{:.6} {}", dur.as_secs_f64(), s); };
}

use bitset_fixed::BitSet;
use itertools::*;
use num::integer::*;
use num_traits::WrappingAdd;
use petgraph::algo::*;
use petgraph::graph::{DiGraph, Graph, NodeIndex, UnGraph};
use petgraph::unionfind::UnionFind;
use petgraph::visit::{
    Bfs, Dfs, EdgeRef, IntoEdges, NodeCount, NodeIndexable, VisitMap, Visitable,
};
//use proconio::{input, marker::{Bytes, Chars, Isize1, Usize1}, source::{auto::AutoSource, line::LineSource, once::OnceSource}};
use rand::prelude::*;
use regex::Regex;
use rustc_hash::{FxHashMap, FxHashSet, FxHasher};
use std::{
    collections::*,
    convert::{TryFrom, TryInto},
    hash::BuildHasherDefault,
    io::{stderr, stdin, stdout, BufRead, BufReader, BufWriter, Read, Write},
    iter::FromIterator,
};
use superslice::Ext;

#[allow(unused_macros)]
#[macro_export]
macro_rules! invariant {
    ($expr: expr) => {
        debug_assert!($expr);
        if !($expr) {
            #[allow(unused_unsafe)]
            unsafe {
                core::hint::unreachable_unchecked()
            };
        }
    };
}

/// chmax, chmin sugar syntax
trait Change {
    fn chmax(&mut self, x: Self);
    fn chmin(&mut self, x: Self);
}
impl<T: PartialOrd> Change for T {
    fn chmax(&mut self, x: T) {
        if *self < x {
            *self = x;
        }
    }
    fn chmin(&mut self, x: T) {
        if *self > x {
            *self = x;
        }
    }
}
pub mod fastproconio {
    use crate::invariant;
    use std::convert::{Into, TryInto};
    /// input macros based on tanakh's input macro / proconio-rs.
    /// tanakh's input macro: <https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8>
    /// proconio-rs: <https://docs.rs/proconio/0.3.8/proconio/>
    /// ProconIBufIter receive `std::io::BufRead` trait. (`std::io::StdinLock`, `std::io::BufReader`, `&[u8]`, etc.)
    #[macro_export]
    macro_rules! finput_inner {
        ($source:expr) => {};
        ($source:expr, ) => {};
        ($source:expr, mut $var:ident : $t:tt $($r:tt)*) => {
            let mut $var = fread_value!($source, $t);
            finput_inner!{$source $($r)*}
        };
        ($source:expr, $var:ident : $t:tt $($r:tt)*) => {
            let $var = fread_value!($source, $t);
            finput_inner!{$source $($r)*}
        };
    }
    #[macro_export]
    macro_rules! fread_value {
        ($source:expr, ( $($t:tt),* )) => { ( $(fread_value!($source, $t)),* ) };
        ($source:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| fread_value!($source, $t)).collect::<Vec<_>>() };
        ($source:expr, u128) => { $source.next_wordtoken().as_slice().parse_u128_raw() };
        ($source:expr, usize) => { $source.next_wordtoken().as_slice().parse_u64_raw() as usize };
        ($source:expr, usize1) => { $source.next_wordtoken().as_slice().parse_u64_raw() as usize - 1 };
        ($source:expr, u64) => { $source.next_wordtoken().as_slice().parse_u64_raw() };
        ($source:expr, u64_1) => { $source.next_wordtoken().as_slice().parse_u64_raw() - 1 };
        ($source:expr, u32) => { $source.next_wordtoken().as_slice().parse_u32_raw() };
        ($source:expr, u32_1) => { $source.next_wordtoken().as_slice().parse_u32_raw() - 1 };
        ($source:expr, u16) => { $source.next_wordtoken().as_slice().parse_u16_raw() };
        ($source:expr, u16_1) => { $source.next_wordtoken().as_slice().parse_u16_raw() - 1 };
        ($source:expr, u8) => { $source.next_wordtoken().as_slice().parse_u8_raw() };
        ($source:expr, i128) => { $source.next_wordtoken().as_slice().parse_i128_raw() };
        ($source:expr, isize) => { $source.next_wordtoken().as_slice().parse_i64_raw() as isize };
        ($source:expr, i64) => { $source.next_wordtoken().as_slice().parse_i64_raw() };
        ($source:expr, i32) => { $source.next_wordtoken().as_slice().parse_i32_raw() };
        ($source:expr, i16) => { $source.next_wordtoken().as_slice().parse_i16_raw() };
        ($source:expr, i8) => { $source.next_wordtoken().as_slice().parse_i8_raw() };
        ($source:expr, byte) => { $source.get_ascii_byte() };
        ($source:expr, Bytes) => {{ $source.next_wordtoken().as_vec() }};
        ($source:expr, BytesToken) => {{ $source.next_wordtoken() }};
        ($source:expr, String) => {unsafe { $source.next_wordtoken().as_string_unchecked() }};
        ($source:expr, LineBytes) => {{ $source.next_linetoken().as_vec() }};
        ($source:expr, LineBytesToken) => {{ $source.next_linetoken() }};
        ($source:expr, LineString) => {unsafe { $source.next_linetoken().as_string_unchecked() }};
        ($source:expr, $t:ty) => {{ unsafe { String::from_utf8_unchecked($source.next_wordtoken().as_slice()) }.parse::<$t>().expect("Parse error") }};
    }
    unsafe fn ptr_offset_u8(dist: *const u8, origin: *const u8) -> usize {
        // Rust 1.47.0 or later, `dist.offset_from(origin) as usize`
        // <https://doc.rust-lang.org/std/primitive.pointer.html#method.offset_from>
        dist as usize - origin as usize
    }
    #[derive(Clone, Debug)]
    pub enum Token<'a /* ' */> {
        Slice(&'a /* ' */ [u8]),
        Bytes(Vec<u8>),
    }
    impl Token<'_ /* ' */> {
        pub fn as_slice(&self) -> &[u8] {
            match self {
                Self::Slice(s) => s,
                Self::Bytes(v) => v.as_slice(),
            }
        }
        pub fn as_vec(self) -> Vec<u8> {
            match self {
                Self::Slice(s) => s.to_vec(),
                Self::Bytes(v) => v,
            }
        }
        pub fn as_string(self) -> Result<String, std::string::FromUtf8Error> {
            String::from_utf8(self.as_vec())
        }
        pub unsafe fn as_string_unchecked(self) -> String {
            String::from_utf8_unchecked(self.as_vec())
        }
    }
    pub trait NextToken {
        fn next_wordtoken(&mut self) -> Token;
        fn next_linetoken(&mut self) -> Token;
    }
    pub struct BytesIter<'a /* ' */>(pub &'a /* ' */ [u8]);
    impl NextToken for BytesIter<'_ /* ' */> {
        fn next_wordtoken(&mut self) -> Token {
            while let [first, remain @ ..] = self.0 {
                if *first < 0x21 {
                    self.0 = remain;
                } else {
                    break;
                }
            }
            let mut split2 = self.0.splitn(2, |&c| c < 0x21);
            let cur = split2.next().unwrap_or(b"");
            self.0 = split2.next().unwrap_or(b"");
            Token::Slice(cur)
        }
        fn next_linetoken(&mut self) -> Token {
            while let [first, remain @ ..] = self.0 {
                if *first < 0x21 {
                    self.0 = remain;
                } else {
                    break;
                }
            }
            let mut split2 = self.0.splitn(2, |&c| c == b'\n');
            let mut cur = split2.next().unwrap_or(b"");
            while let [remain @ .., last] = cur {
                if *last < 0x21 {
                    cur = remain;
                } else {
                    break;
                }
            }
            self.0 = split2.next().unwrap_or(b"");
            Token::Slice(cur)
        }
    }

    /// Interaction with `std::io::BufRead` Trait, Implementation of `Iterator<Item = u8>`
    pub struct ProconIBufIter<R: std::io::BufRead> {
        inner: R,
        raw: *const u8,
        ptr: *const u8,
        end: *const u8,
        len: usize,
        balign: *const u8,
        wmask: Vec<u64>,
    }
    impl<R: std::io::BufRead> ProconIBufIter<R> {
        pub fn new(inner: R) -> Self {
            const EMPTY_U8_SLICE: &'static /* ' */ [u8] = b"";
            Self {
                inner,
                raw: EMPTY_U8_SLICE.as_ptr(),
                ptr: EMPTY_U8_SLICE.as_ptr(),
                end: EMPTY_U8_SLICE.as_ptr(),
                len: 0,
                balign: EMPTY_U8_SLICE.as_ptr(),
                wmask: vec![0u64; 200],
            }
        }
    }
    impl<R: std::io::BufRead> ProconIBufIter<R> {
        pub fn buf_empty(&self) -> bool {
            self.ptr == self.end
        }
        #[allow(clippy::missing_safety_doc)]
        #[cold]
        unsafe fn inner_read(&mut self) -> bool {
            invariant!(self.ptr == self.end);
            self.inner.consume(ptr_offset_u8(self.ptr, self.raw));
            if let Ok(s) = self.inner.fill_buf() {
                self.raw = s.as_ptr();
                self.ptr = s.as_ptr();
                self.end = s.as_ptr().add(s.len());
                self.len = s.len();
                self.balign = (self.raw as usize & !0x3f) as *const u8;
                let alignlen = (((self.end as usize) + 0x3f) & (!0x3f)) - self.balign as usize;
                let wmasklen = (alignlen + 63) / 64;
                #[cfg(target_arch = "x86_64")]
                {
                    #[target_feature(enable = "avx2")]
                    unsafe fn genmask_avx2(asl: &[u8], bsl: &mut [u64]) {
                        use std::arch::x86_64::*;
                        let diff = _mm256_set1_epi8(-0x21);
                        for (a, b) in asl.chunks_exact(64).zip(bsl.iter_mut()) {
                            let s0 = _mm256_load_si256(std::mem::transmute(a.as_ptr().add(0)));
                            let s1 = _mm256_load_si256(std::mem::transmute(a.as_ptr().add(32)));
                            let a0 = _mm256_add_epi8(s0, diff);
                            let a1 = _mm256_add_epi8(s1, diff);
                            let m0 = _mm256_movemask_epi8(_mm256_andnot_si256(s0, a0)) as u32;
                            let m1 = _mm256_movemask_epi8(_mm256_andnot_si256(s1, a1)) as u32;
                            *b = ((m1 as u64) << 32) | (m0 as u64);
                        }
                    }
                    unsafe fn genmask_sse2(asl: &[u8], bsl: &mut [u64]) {
                        use std::arch::x86_64::*;
                        let diff = _mm_set1_epi8(-0x21);
                        for (a, b) in asl.chunks_exact(64).zip(bsl.iter_mut()) {
                            let s0 = _mm_load_si128(std::mem::transmute(a.as_ptr().add(0)));
                            let s1 = _mm_load_si128(std::mem::transmute(a.as_ptr().add(16)));
                            let s2 = _mm_load_si128(std::mem::transmute(a.as_ptr().add(32)));
                            let s3 = _mm_load_si128(std::mem::transmute(a.as_ptr().add(48)));
                            let a0 = _mm_add_epi8(s0, diff);
                            let a1 = _mm_add_epi8(s1, diff);
                            let a2 = _mm_add_epi8(s2, diff);
                            let a3 = _mm_add_epi8(s3, diff);
                            let m0 = _mm_movemask_epi8(_mm_andnot_si128(s0, a0)) as u16;
                            let m1 = _mm_movemask_epi8(_mm_andnot_si128(s1, a1)) as u16;
                            let m2 = _mm_movemask_epi8(_mm_andnot_si128(s2, a2)) as u16;
                            let m3 = _mm_movemask_epi8(_mm_andnot_si128(s3, a3)) as u16;
                            *b = ((m3 as u64) << 48)
                                | ((m2 as u64) << 32)
                                | ((m1 as u64) << 16)
                                | (m0 as u64);
                        }
                    }
                    if self.wmask.len() <= wmasklen {
                        self.wmask
                            .extend(std::iter::repeat(0).take(wmasklen + 1 - self.wmask.len()));
                    }
                    let asl = std::slice::from_raw_parts(self.balign, wmasklen * 64);
                    if is_x86_feature_detected!("avx2") {
                        genmask_avx2(asl, &mut self.wmask);
                    } else {
                        genmask_sse2(asl, &mut self.wmask);
                    }
                };
                self.len != 0
            } else {
                self.raw = self.ptr;
                self.len = self.end as usize - self.ptr as usize;
                false
            }
        }
        #[allow(clippy::missing_safety_doc)]
        unsafe fn next_unchecked(&mut self) -> u8 {
            let p = self.ptr;
            self.ptr = p.add(1);
            *p
        }
        /// skip unmatch bytes
        pub fn skipuntil_bytes_fn<F: FnMut(u8) -> bool>(&mut self, f: &mut F) -> bool {
            loop {
                let mut ptr = self.ptr;
                while ptr != self.end {
                    if f(unsafe { *ptr }) {
                        self.ptr = ptr;
                        return true;
                    }
                    unsafe {
                        ptr = ptr.add(1);
                    }
                }
                self.ptr = ptr;
                if unsafe { !self.inner_read() } {
                    return false;
                }
            }
        }
        pub fn get_ascii_bytes(&mut self, vec: &mut Vec<u8>) {
            if !self.skipuntil_bytes_fn(&mut |c: u8| c > b' ') {
                return;
            }
            #[cfg(target_arch = "x86_64")]
            unsafe {
                let ptr = self.ptr;
                let pdiff = (self.ptr as usize) - (self.balign as usize) + 1;
                let (p64q, p64r) = (pdiff / 64, pdiff % 64);
                let mut w = self.wmask.as_ptr().add(p64q);
                let wmask = (*w) & ((!0u64) << p64r);
                let mut p = self.balign.add(p64q * 64);
                if wmask != 0 {
                    p = p.add(wmask.trailing_zeros() as usize);
                    if p < self.end {
                        self.ptr = p.add(1);
                        vec.extend_from_slice(std::slice::from_raw_parts(
                            ptr,
                            p as usize - ptr as usize,
                        ));
                        return;
                    }
                }
                p = p.add(64);
                w = w.add(1);
                let end64 = self.end.sub(64);
                while p < end64 {
                    let wmask = *w;
                    if wmask != 0 {
                        let tlz = wmask.trailing_zeros();
                        let pp = p.add(tlz as usize);
                        self.ptr = pp.add(1);
                        vec.extend_from_slice(std::slice::from_raw_parts(
                            ptr,
                            pp as usize - ptr as usize,
                        ));
                        return;
                    }
                    p = p.add(64);
                    w = w.add(1);
                }
                if p < self.end {
                    let wmask = *w;
                    if wmask != 0 {
                        let tlz = wmask.trailing_zeros();
                        let pp = p.add(tlz as usize);
                        if pp < self.end {
                            self.ptr = pp.add(1);
                            vec.extend_from_slice(std::slice::from_raw_parts(
                                ptr,
                                pp as usize - ptr as usize,
                            ));
                            return;
                        }
                    }
                }
                vec.extend_from_slice(std::slice::from_raw_parts(
                    ptr,
                    self.end as usize - ptr as usize,
                ));
                loop {
                    self.ptr = self.end;
                    if !self.inner_read() {
                        return;
                    }
                    let ptr = self.ptr;
                    let pdiff = (ptr as usize) - (self.balign as usize);
                    let (p64q, p64r) = (pdiff / 64, pdiff % 64);
                    let mut w = self.wmask.as_ptr().add(p64q);
                    let mut wmask = (*w) & ((!0u64) << p64r);
                    let mut p = self.balign.add(p64q * 64);
                    while p < self.end {
                        if wmask != 0 {
                            p = p.add(wmask.trailing_zeros() as usize);
                            if p < self.end {
                                self.ptr = p.add(1);
                                vec.extend_from_slice(std::slice::from_raw_parts(
                                    ptr,
                                    p as usize - ptr as usize,
                                ));
                                return;
                            }
                            break;
                        }
                        p = p.add(64);
                        w = w.add(1);
                        wmask = *w;
                    }
                    vec.extend_from_slice(std::slice::from_raw_parts(
                        ptr,
                        self.end as usize - ptr as usize,
                    ));
                }
            }
            #[cfg(not(target_arch = "x86_64"))]
            unsafe {
                let ptr = self.ptr;
                let mut p = ptr.add(1);
                while p < self.end {
                    if *p <= b' ' {
                        self.ptr = p.add(1);
                        vec.extend_from_slice(std::slice::from_raw_parts(
                            ptr,
                            p as usize - ptr as usize,
                        ));
                        return;
                    }
                    p = p.add(1);
                }
                vec.extend_from_slice(std::slice::from_raw_parts(
                    ptr,
                    self.end as usize - ptr as usize,
                ));
                loop {
                    self.ptr = self.end;
                    if !self.inner_read() {
                        break;
                    }
                    let ptr = self.ptr;
                    let mut p = ptr;
                    while p < self.end {
                        if *p <= b' ' {
                            self.ptr = p.add(1);
                            vec.extend_from_slice(std::slice::from_raw_parts(
                                ptr,
                                p as usize - ptr as usize,
                            ));
                            return;
                        }
                        p = p.add(1);
                    }
                    vec.extend_from_slice(std::slice::from_raw_parts(
                        ptr,
                        self.end as usize - ptr as usize,
                    ));
                }
                return;
            }
        }
    }
    impl<R: std::io::BufRead> NextToken for ProconIBufIter<R> {
        #[inline]
        fn next_wordtoken(&mut self) -> Token {
            if !self.skipuntil_bytes_fn(&mut |c: u8| c > b' ') {
                return Token::Slice(b"");
            }
            #[cfg(target_arch = "x86_64")]
            unsafe {
                let ptr = self.ptr;
                let pdiff = (self.ptr as usize) - (self.balign as usize) + 1;
                let (p64q, p64r) = (pdiff / 64, pdiff % 64);
                let mut w = self.wmask.as_ptr().add(p64q);
                let wmask = (*w) & ((!0u64) << p64r);
                let mut p = self.balign.add(p64q * 64);
                if wmask != 0 {
                    p = p.add(wmask.trailing_zeros() as usize);
                    if p < self.end {
                        self.ptr = p.add(1);
                        return Token::Slice(std::slice::from_raw_parts(
                            ptr,
                            p as usize - ptr as usize,
                        ));
                    }
                }
                p = p.add(64);
                w = w.add(1);
                let end64 = self.end.sub(64);
                while p < end64 {
                    let wmask = *w;
                    if wmask != 0 {
                        let tlz = wmask.trailing_zeros();
                        let pp = p.add(tlz as usize);
                        self.ptr = pp.add(1);
                        return Token::Slice(std::slice::from_raw_parts(
                            ptr,
                            pp as usize - ptr as usize,
                        ));
                    }
                    p = p.add(64);
                    w = w.add(1);
                }
                if p < self.end {
                    let wmask = *w;
                    if wmask != 0 {
                        let tlz = wmask.trailing_zeros();
                        let pp = p.add(tlz as usize);
                        if pp < self.end {
                            self.ptr = pp.add(1);
                            return Token::Slice(std::slice::from_raw_parts(
                                ptr,
                                pp as usize - ptr as usize,
                            ));
                        }
                    }
                }
                let mut v =
                    std::slice::from_raw_parts(ptr, self.end as usize - ptr as usize).to_vec();
                loop {
                    self.ptr = self.end;
                    if !self.inner_read() {
                        return Token::Bytes(v);
                    }
                    let ptr = self.ptr;
                    let pdiff = (ptr as usize) - (self.balign as usize);
                    let (p64q, p64r) = (pdiff / 64, pdiff % 64);
                    let mut w = self.wmask.as_ptr().add(p64q);
                    let mut wmask = (*w) & ((!0u64) << p64r);
                    let mut p = self.balign.add(p64q * 64);
                    while p < self.end {
                        if wmask != 0 {
                            p = p.add(wmask.trailing_zeros() as usize);
                            if p < self.end {
                                self.ptr = p.add(1);
                                v.extend_from_slice(std::slice::from_raw_parts(
                                    ptr,
                                    p as usize - ptr as usize,
                                ));
                                return Token::Bytes(v);
                            }
                            break;
                        }
                        p = p.add(64);
                        w = w.add(1);
                        wmask = *w;
                    }
                    v.extend_from_slice(std::slice::from_raw_parts(
                        ptr,
                        self.end as usize - ptr as usize,
                    ));
                }
            }
            #[cfg(not(target_arch = "x86_64"))]
            unsafe {
                let ptr = self.ptr;
                let mut p = ptr.add(1);
                while p < self.end {
                    if *p <= b' ' {
                        self.ptr = p.add(1);
                        return Token::Slice(std::slice::from_raw_parts(
                            ptr,
                            p as usize - ptr as usize,
                        ));
                    }
                    p = p.add(1);
                }
                let mut v =
                    std::slice::from_raw_parts(ptr, self.end as usize - ptr as usize).to_vec();
                loop {
                    self.ptr = self.end;
                    if !self.inner_read() {
                        break;
                    }
                    let ptr = self.ptr;
                    let mut p = ptr;
                    while p < self.end {
                        if *p <= b' ' {
                            self.ptr = p.add(1);
                            v.extend_from_slice(std::slice::from_raw_parts(
                                ptr,
                                p as usize - ptr as usize,
                            ));
                            return Token::Bytes(v);
                        }
                        p = p.add(1);
                    }
                    v.extend_from_slice(std::slice::from_raw_parts(
                        ptr,
                        self.end as usize - ptr as usize,
                    ));
                }
                return Token::Bytes(v);
            }
        }
        #[inline]
        fn next_linetoken(&mut self) -> Token {
            if !self.skipuntil_bytes_fn(&mut |c: u8| c >= b' ') {
                return Token::Slice(b"");
            }
            #[cfg(target_arch = "x86_64")]
            unsafe {
                let ptr = self.ptr;
                let pdiff = (self.ptr as usize) - (self.balign as usize) + 1;
                let (p64q, p64r) = (pdiff / 64, pdiff % 64);
                let mut w = self.wmask.as_ptr().add(p64q);
                let mut wmask = (*w) & ((!0u64) << p64r);
                let mut p = self.balign.add(p64q * 64);
                's: /* ' */ while p < self.end {
                    while wmask != 0 {
                        let tlz = wmask.trailing_zeros();
                        let pp = p.add(tlz as usize);
                        if pp >= self.end {
                            break 's; /* ' */
                        }
                        if *pp < b' ' {
                            self.ptr = pp.add(1);
                            return Token::Slice(std::slice::from_raw_parts(
                                ptr,
                                pp as usize - ptr as usize,
                            ));
                        }
                        wmask &= wmask.wrapping_sub(1); // elase least one bit
                    }
                    p = p.add(64);
                    w = w.add(1);
                    wmask = *w;
                }
                let mut v =
                    std::slice::from_raw_parts(ptr, self.end as usize - ptr as usize).to_vec();
                loop {
                    self.ptr = self.end;
                    if !self.inner_read() {
                        break;
                    }
                    let ptr = self.ptr;
                    let pdiff = (ptr as usize) - (self.balign as usize);
                    let (p64q, p64r) = (pdiff / 64, pdiff % 64);
                    let mut w = self.wmask.as_ptr().add(p64q);
                    let mut wmask = (*self.wmask.get_unchecked(p64q)) & ((!0u64) << p64r);
                    let mut p = self.balign.add(p64q * 64);
                    'v: /* ' */ while p < self.end {
                        while wmask != 0 {
                            let tlz = wmask.trailing_zeros();
                            let pp = p.add(tlz as usize);
                            if pp >= self.end {
                                break 'v; /* ' */
                            }
                            assert!(*pp < b' ');
                            if (*pp) < b' ' {
                                self.ptr = pp.add(1);
                                v.extend_from_slice(std::slice::from_raw_parts(
                                    ptr,
                                    pp as usize - ptr as usize,
                                ));
                                return Token::Bytes(v);
                            }
                            wmask &= wmask.wrapping_sub(1); // elase least one bit
                        }
                        p = p.add(64);
                        w = w.add(1);
                        wmask = *w;
                    }
                    v.extend_from_slice(std::slice::from_raw_parts(
                        ptr,
                        self.end as usize - ptr as usize,
                    ));
                }
                return Token::Bytes(v);
            }
            #[cfg(not(target_arch = "x86_64"))]
            unsafe {
                let ptr = self.ptr;
                let mut p = ptr.add(1);
                while p < self.end {
                    if *p < b' ' {
                        self.ptr = p.add(1);
                        return Token::Slice(std::slice::from_raw_parts(
                            ptr,
                            p as usize - ptr as usize,
                        ));
                    }
                    p = p.add(1);
                }
                let mut v =
                    std::slice::from_raw_parts(ptr, self.end as usize - ptr as usize).to_vec();
                loop {
                    self.ptr = self.end;
                    if !self.inner_read() {
                        break;
                    }
                    let ptr = self.ptr;
                    let mut p = ptr;
                    while p < self.end {
                        if *p < b' ' {
                            self.ptr = p.add(1);
                            v.extend_from_slice(std::slice::from_raw_parts(
                                ptr,
                                p as usize - ptr as usize,
                            ));
                            return Token::Bytes(v);
                        }
                        p = p.add(1);
                    }
                    v.extend_from_slice(std::slice::from_raw_parts(
                        ptr,
                        self.end as usize - ptr as usize,
                    ));
                }
                return Token::Bytes(v);
            }
        }
    }
    impl<R: std::io::BufRead> Iterator for ProconIBufIter<R> {
        type Item = u8;
        fn next(&mut self) -> Option<Self::Item> {
            if !self.buf_empty() || unsafe { self.inner_read() } {
                Some(unsafe { self.next_unchecked() })
            } else {
                None
            }
        }
        fn size_hint(&self) -> (usize, Option<usize>) {
            (usize::max_value(), None)
        }
    }
    pub trait UPrimInt:
        Copy
        + Default
        + std::cmp::Ord
        + std::ops::Add<Output = Self>
        + std::ops::Sub<Output = Self>
        + std::ops::Mul<Output = Self>
        + std::ops::Div<Output = Self>
        + std::ops::Rem<Output = Self>
        + std::ops::AddAssign
        + std::ops::SubAssign
        + std::ops::MulAssign
        + std::ops::DivAssign
        + std::ops::RemAssign
        + std::ops::Shl<u32, Output = Self>
        + std::ops::Shr<u32, Output = Self>
        + std::ops::ShlAssign<u32>
        + std::ops::ShrAssign<u32>
        + std::ops::BitAnd<Output = Self>
        + std::ops::BitOr<Output = Self>
        + std::ops::BitXor<Output = Self>
        + std::ops::BitAndAssign
        + std::ops::BitOrAssign
        + std::ops::BitXorAssign
        + std::convert::From<u8>
    {
        const BITS: u32;
        fn count_zeros(self) -> u32;
        fn trailing_zeros(self) -> u32;
        fn leading_zeros(self) -> u32;
    }
    macro_rules! impl_uprimint {
        ($t:ty) => {
            impl UPrimInt for $t {
                const BITS: u32 = (0 as $t).count_zeros();
                fn count_zeros(self) -> u32 {
                    self.count_zeros()
                }
                fn trailing_zeros(self) -> u32 {
                    self.trailing_zeros()
                }
                fn leading_zeros(self) -> u32 {
                    self.leading_zeros()
                }
            }
        };
    }
    impl_uprimint!(u8);
    impl_uprimint!(u16);
    impl_uprimint!(u32);
    impl_uprimint!(u64);
    impl_uprimint!(u128);
    impl_uprimint!(usize);
    pub trait IPrimInt:
        Copy
        + Default
        + std::cmp::Ord
        + std::ops::Add<Output = Self>
        + std::ops::Sub<Output = Self>
        + std::ops::Neg<Output = Self>
        + std::ops::Mul<Output = Self>
        + std::ops::Div<Output = Self>
        + std::ops::Rem<Output = Self>
        + std::convert::From<i8>
    {
        const BITS: u32;
    }
    macro_rules! impl_iprimint {
        ($t:ty) => {
            impl IPrimInt for $t {
                const BITS: u32 = (0 as $t).count_zeros();
            }
        };
    }
    impl_iprimint!(i8);
    impl_iprimint!(i16);
    impl_iprimint!(i32);
    impl_iprimint!(i64);
    impl_iprimint!(i128);
    impl_iprimint!(isize);

    #[inline]
    fn parseuint_arith8le(mut a: u64) -> u64 {
        a = (a & 0x0f0f0f0f0f0f0f0f).wrapping_mul((10 << 8) + 1) >> 8;
        a = (a & 0x00ff00ff00ff00ff).wrapping_mul((100 << 16) + 1) >> 16;
        (a & 0x0000ffff0000ffff).wrapping_mul((10000 << 32) + 1) >> 32
    }
    #[inline]
    #[allow(unused)]
    fn parseuint_arith8be(mut a: u64) -> u64 {
        a = (a & 0x0f0f0f0f0f0f0f0f).wrapping_mul((1 << 8) + 10) >> 8;
        a = (a & 0x00ff00ff00ff00ff).wrapping_mul((1 << 16) + 100) >> 16;
        (a & 0x0000ffff0000ffff).wrapping_mul((1 << 32) + 10000) >> 32
    }
    #[inline]
    fn parseuint_arith4le(mut a: u32) -> u32 {
        a = (a & 0x0f0f0f0f).wrapping_mul((10 << 8) + 1) >> 8;
        (a & 0x00ff00ff).wrapping_mul((100 << 16) + 1) >> 16
    }
    #[inline]
    #[allow(unused)]
    fn parseuint_arith4be(mut a: u32) -> u32 {
        a = (a & 0x0f0f0f0f).wrapping_mul((1 << 8) + 10) >> 8;
        (a & 0x00ff00ff).wrapping_mul((1 << 16) + 100) >> 16
    }
    #[inline]
    fn parseuint_arith2le(a: u16) -> u16 {
        (a & 0x0f0f).wrapping_mul((10 << 8) + 1) >> 8
    }
    #[inline]
    #[allow(unused)]
    fn parseuint_arith2be(a: u16) -> u16 {
        (a & 0x0f0f).wrapping_mul((1 << 8) + 10) >> 8
    }
    #[inline(always)]
    #[allow(unused)]
    fn parseuint_arith1(a: u8) -> u8 {
        a & 0x0f
    }
    #[inline(always)]
    fn parseuint_raw32b(s: [u8; 32]) -> u128 {
        let a = parseuint_arith8le(u64::from_le_bytes(s[0..8].try_into().unwrap()));
        let b = parseuint_arith8le(u64::from_le_bytes(s[8..16].try_into().unwrap()));
        let c = parseuint_arith8le(u64::from_le_bytes(s[16..24].try_into().unwrap()));
        let d = parseuint_arith8le(u64::from_le_bytes(s[24..32].try_into().unwrap()));
        ((a * 100000000 + b) as u128) * 10000000000000000 + ((c * 100000000 + d) as u128)
    }
    #[inline(always)]
    fn parseuint_raw16b(s: [u8; 16]) -> u64 {
        let a = parseuint_arith8le(u64::from_le_bytes(s[0..8].try_into().unwrap()));
        let b = parseuint_arith8le(u64::from_le_bytes(s[8..16].try_into().unwrap()));
        a * 100000000 + b
    }
    #[inline(always)]
    fn parseuint_raw8b(s: [u8; 8]) -> u64 {
        parseuint_arith8le(u64::from_le_bytes(s))
    }
    #[rustfmt::skip]
    #[inline(always)]
    fn parseuint_raw7b(s: &[u8]) -> u64 {
        invariant!(s.len() <= 8);
        match s.len() {
            0 => 0,
            1 => parseuint_arith1(s[0]) as u64,
            2 => parseuint_arith2le(u16::from_le_bytes(s[0..2].try_into().unwrap())) as u64,
            3 => parseuint_arith4le(((s[0] as u32) << 8) | ((u16::from_le_bytes(s[1..3].try_into().unwrap()) as u32) << 16)) as u64,
            4 => parseuint_arith4le(u32::from_le_bytes(s[0..4].try_into().unwrap())) as u64,
            5 => parseuint_arith8le(((s[0] as u64) << 24) | ((u32::from_le_bytes(s[1..5].try_into().unwrap()) as u64) << 32)),
            6 => parseuint_arith8le(((u16::from_le_bytes(s[0..2].try_into().unwrap()) as u64) << 16) | ((u32::from_le_bytes(s[2..6].try_into().unwrap()) as u64) << 32)),
            7 => parseuint_arith8le(((u32::from_le_bytes(s[0..4].try_into().unwrap()) as u64) << 8) | ((u32::from_le_bytes(s[3..7].try_into().unwrap()) as u64) << 32)),
            _ => parseuint_arith8le(u64::from_le_bytes(s[0..8].try_into().unwrap())),
        }
    }
    #[inline(always)]
    fn parseuint_raw4b(s: [u8; 4]) -> u32 {
        parseuint_arith4le(u32::from_le_bytes(s))
    }
    #[rustfmt::skip]
    #[inline(always)]
    fn parseuint_raw3b(s: &[u8]) -> u32 {
        invariant!(s.len() <= 4);
        match s.len() {
            0 => 0,
            1 => parseuint_arith1(s[0]) as u32,
            2 => parseuint_arith2le(u16::from_le_bytes(s[0..2].try_into().unwrap())) as u32,
            3 => parseuint_arith4le(((s[0] as u32) << 8) | ((u16::from_le_bytes(s[1..3].try_into().unwrap()) as u32) << 16)),
            _ => parseuint_arith4le(u32::from_le_bytes(s[0..4].try_into().unwrap())),
        }
    }
    #[inline(always)]
    fn parseuint_raw2b(s: [u8; 2]) -> u16 {
        parseuint_arith2le(u16::from_le_bytes(s))
    }
    #[inline(always)]
    fn parseuint_raw1b(s: u8) -> u8 {
        parseuint_arith1(s)
    }
    pub trait ByteParseIntRaw {
        fn parse_u128_raw(&self) -> u128;
        fn parse_u64_raw(&self) -> u64;
        fn parse_u32_raw(&self) -> u32;
        fn parse_u16_raw(&self) -> u16;
        fn parse_u8_raw(&self) -> u8;
        fn parse_i128_raw(&self) -> i128;
        fn parse_i64_raw(&self) -> i64;
        fn parse_i32_raw(&self) -> i32;
        fn parse_i16_raw(&self) -> i16;
        fn parse_i8_raw(&self) -> i8;
        fn parse_u128_rawopt(&self) -> Option<u128>;
        fn parse_u64_rawopt(&self) -> Option<u64>;
        fn parse_u32_rawopt(&self) -> Option<u32>;
        fn parse_u16_rawopt(&self) -> Option<u16>;
        fn parse_u8_rawopt(&self) -> Option<u8>;
    }
    impl ByteParseIntRaw for &[u8] {
        // parse_u128_raw: empty or int(self) > u128::MAX or self.len() > 39 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        #[rustfmt::skip]
        #[inline(always)]
        fn parse_u128_raw(&self) -> u128 {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 39);
            invariant!(self.iter().all(u8::is_ascii_digit));
            match self.len() {
                0 => 0,
                1 => parseuint_raw1b(self[0]) as u128,
                2 => parseuint_raw2b(self[0..2].try_into().unwrap()) as u128,
                3 => parseuint_arith4le(((self[0] as u32) << 8) | ((u16::from_le_bytes(self[1..3].try_into().unwrap()) as u32) << 16)) as u128,
                4 => parseuint_raw4b(self[0..4].try_into().unwrap()) as u128,
                5 => parseuint_arith8le(((self[0] as u64) << 24) | ((u32::from_le_bytes(self[1..5].try_into().unwrap()) as u64) << 32)) as u128,
                6 => parseuint_arith8le(((u16::from_le_bytes(self[0..2].try_into().unwrap()) as u64) << 16) | ((u32::from_le_bytes(self[2..6].try_into().unwrap()) as u64) << 32)) as u128,
                7 => parseuint_arith8le(((u32::from_le_bytes(self[0..4].try_into().unwrap()) as u64) << 8) | ((u32::from_le_bytes(self[3..7].try_into().unwrap()) as u64) << 32)) as u128,
                8 => parseuint_raw8b(self[0..8].try_into().unwrap()) as u128,
                9 => ((parseuint_raw1b(self[0]) as u64) * 1_0000_0000 + parseuint_raw8b(self[1..9].try_into().unwrap())) as u128,
                10 => ((parseuint_raw2b(self[0..2].try_into().unwrap()) as u64) * 1_0000_0000 + parseuint_raw8b(self[2..10].try_into().unwrap())) as u128,
                11 => ((parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap()) << 8) as u64) * 1_0000_0000 + parseuint_raw8b(self[3..11].try_into().unwrap())) as u128,
                12 => ((parseuint_raw4b(self[0..4].try_into().unwrap()) as u64) * 1_0000_0000 + parseuint_raw8b(self[4..12].try_into().unwrap())) as u128,
                13 => (parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 24) * 1_0000_0000 + parseuint_raw8b(self[5..13].try_into().unwrap())) as u128,
                14 => (parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 16) * 1_0000_0000 + parseuint_raw8b(self[6..14].try_into().unwrap())) as u128,
                15 => (parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) <<  8) * 1_0000_0000 + parseuint_raw8b(self[7..15].try_into().unwrap())) as u128,
                16 => parseuint_raw16b(self[0..16].try_into().unwrap()) as u128,
                17 => ((parseuint_raw1b(self[0]) as u64) * 1_0000_0000_0000_0000 + parseuint_raw16b(self[1..17].try_into().unwrap())) as u128,
                18 => ((parseuint_raw2b(self[0..2].try_into().unwrap()) as u64) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[2..18].try_into().unwrap()))) as u128,
                19 => ((parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap()) << 8) as u64) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[3..19].try_into().unwrap()))) as u128,
                20 => (parseuint_raw4b(self[0..4].try_into().unwrap()) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[4..20].try_into().unwrap()) as u128),
                21 => (parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 24) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[5..21].try_into().unwrap()) as u128),
                22 => (parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 16) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[6..22].try_into().unwrap()) as u128),
                23 => (parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) <<  8) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[7..23].try_into().unwrap()) as u128),
                24 => (parseuint_raw8b(self[0..8].try_into().unwrap()) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[8..24].try_into().unwrap()) as u128),
                25 => (((parseuint_raw1b(self[0]) as u64) * 1_0000_0000 + parseuint_raw8b(self[1..9].try_into().unwrap())) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[9..25].try_into().unwrap()) as u128),
                26 => (((parseuint_raw2b(self[0..2].try_into().unwrap()) as u64) * 1_0000_0000 + parseuint_raw8b(self[2..10].try_into().unwrap())) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[10..26].try_into().unwrap()) as u128),
                27 => (((parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap()) <<  8) as u64) * 1_0000_0000 + parseuint_raw8b(self[3..11].try_into().unwrap())) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[11..27].try_into().unwrap()) as u128),
                28 => (((parseuint_raw4b(self[0..4].try_into().unwrap()) as u64) * 1_0000_0000 + parseuint_raw8b(self[4..12].try_into().unwrap())) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[12..28].try_into().unwrap()) as u128),
                29 => (((parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 24) as u64) * 1_0000_0000 + parseuint_raw8b(self[5..13].try_into().unwrap())) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[13..29].try_into().unwrap()) as u128),
                30 => (((parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 16) as u64) * 1_0000_0000 + parseuint_raw8b(self[6..14].try_into().unwrap())) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[14..30].try_into().unwrap()) as u128),
                31 => (((parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) <<  8) as u64) * 1_0000_0000 + parseuint_raw8b(self[7..15].try_into().unwrap())) as u128) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[15..31].try_into().unwrap()) as u128),
                32 => parseuint_raw32b(self[0..32].try_into().unwrap()),
                33 => parseuint_raw32b(self[0..32].try_into().unwrap()) * 10 + (parseuint_raw1b(self[32]) as u128),
                34 => parseuint_raw32b(self[0..32].try_into().unwrap()) * 100 + (parseuint_raw2b(self[32..34].try_into().unwrap()) as u128),
                35 => parseuint_raw32b(self[0..32].try_into().unwrap()) * 1000 + (parseuint_arith4le(u32::from_le_bytes(self[31..35].try_into().unwrap()) & 0x00000000_0f0f0f00) as u128),
                36 => parseuint_raw32b(self[0..32].try_into().unwrap()) * 1_0000 + (parseuint_raw4b(self[32..36].try_into().unwrap()) as u128),
                37 => parseuint_raw32b(self[0..32].try_into().unwrap()) * 10_0000 + (parseuint_arith8le(u64::from_le_bytes(self[29..37].try_into().unwrap()) & 0x0f0f0f0f_0f000000) as u128),
                38 => parseuint_raw32b(self[0..32].try_into().unwrap()) * 100_0000 + (parseuint_arith8le(u64::from_le_bytes(self[30..38].try_into().unwrap()) & 0x0f0f0f0f_0f0f0000) as u128),
                _  => parseuint_raw32b(self[0..32].try_into().unwrap()) * 1000_0000 + (parseuint_arith8le(u64::from_le_bytes(self[31..39].try_into().unwrap()) & 0x0f0f0f0f_0f0f0f00) as u128),
            }
        }
        // parse_u64_raw: empty or int(self) > u64::MAX or self.len() > 20 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        #[rustfmt::skip]
        #[inline(always)]
        fn parse_u64_raw(&self) -> u64 {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 20);
            invariant!(self.iter().all(u8::is_ascii_digit));
            match self.len() {
                0 => 0,
                1 => parseuint_arith1(self[0]) as u64,
                2 => parseuint_arith2le(u16::from_le_bytes(self[0..2].try_into().unwrap())) as u64,
                3 => parseuint_arith4le(((self[0] as u32) << 8) | ((u16::from_le_bytes(self[1..3].try_into().unwrap()) as u32) << 16)) as u64,
                4 => parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap())) as u64,
                5 => parseuint_arith8le(((self[0] as u64) << 24) | ((u32::from_le_bytes(self[1..5].try_into().unwrap()) as u64) << 32)),
                6 => parseuint_arith8le(((u16::from_le_bytes(self[0..2].try_into().unwrap()) as u64) << 16) | ((u32::from_le_bytes(self[2..6].try_into().unwrap()) as u64) << 32)),
                7 => parseuint_arith8le(((u32::from_le_bytes(self[0..4].try_into().unwrap()) as u64) << 8) | ((u32::from_le_bytes(self[3..7].try_into().unwrap()) as u64) << 32)),
                8 => parseuint_raw8b(self[0..8].try_into().unwrap()),
                9 => (parseuint_arith1(self[0]) as u64) * 1_0000_0000 + parseuint_raw8b(self[1..9].try_into().unwrap()),
                10 => (parseuint_arith2le(u16::from_le_bytes(self[0..2].try_into().unwrap())) as u64) * 1_0000_0000 + parseuint_raw8b(self[2..10].try_into().unwrap()),
                11 => (parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap()) << 8) as u64) * 1_0000_0000 + parseuint_raw8b(self[3..11].try_into().unwrap()),
                12 => (parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap())) as u64) * 1_0000_0000 + parseuint_raw8b(self[4..12].try_into().unwrap()),
                13 => parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 24) * 1_0000_0000 + parseuint_raw8b(self[5..13].try_into().unwrap()),
                14 => parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 16) * 1_0000_0000 + parseuint_raw8b(self[6..14].try_into().unwrap()),
                15 => parseuint_arith8le(u64::from_le_bytes(self[0..8].try_into().unwrap()) << 8) * 1_0000_0000 + parseuint_raw8b(self[7..15].try_into().unwrap()),
                16 => parseuint_raw16b(self[0..16].try_into().unwrap()),
                17 => (parseuint_arith1(self[0]) as u64) * 1_0000_0000_0000_0000 + parseuint_raw16b(self[1..17].try_into().unwrap()),
                18 => (parseuint_arith2le(u16::from_le_bytes(self[0..2].try_into().unwrap())) as u64) * 1_0000_0000_0000_0000 + parseuint_raw16b(self[2..18].try_into().unwrap()),
                19 => (parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap()) << 8) as u64) * 1_0000_0000_0000_0000 + parseuint_raw16b(self[3..19].try_into().unwrap()),
                _ => (parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap())) as u64) * 1_0000_0000_0000_0000 + (parseuint_raw16b(self[4..20].try_into().unwrap())),
            }
        }
        // parse_u32_raw: empty or int(self) > u32::MAX or self.len() > 10 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        #[rustfmt::skip]
        #[inline(always)]
        fn parse_u32_raw(&self) -> u32 {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 10);
            invariant!(self.iter().all(u8::is_ascii_digit));
            match self.len() {
                0 => 0,
                1 => parseuint_arith1(self[0]) as u32,
                2 => parseuint_arith2le(u16::from_le_bytes(self[0..2].try_into().unwrap())) as u32,
                3 => parseuint_arith4le(((self[0] as u32) << 8) | ((u16::from_le_bytes(self[1..3].try_into().unwrap()) as u32) << 16)),
                4 => parseuint_arith4le(u32::from_le_bytes(self[0..4].try_into().unwrap())),
                5 => parseuint_arith8le(((self[0] as u64) << 24) | ((u32::from_le_bytes(self[1..5].try_into().unwrap()) as u64) << 32)) as u32,
                6 => parseuint_arith8le(((u16::from_le_bytes(self[0..2].try_into().unwrap()) as u64) << 16) | ((u32::from_le_bytes(self[2..6].try_into().unwrap()) as u64) << 32)) as u32,
                7 => parseuint_arith8le(((u32::from_le_bytes(self[0..4].try_into().unwrap()) as u64) << 8) | ((u32::from_le_bytes(self[3..7].try_into().unwrap()) as u64) << 32)) as u32,
                8 => parseuint_raw8b(self[0..8].try_into().unwrap()) as u32,
                9 => (parseuint_arith1(self[0]) as u32) * 1_0000_0000 + parseuint_raw8b(self[1..9].try_into().unwrap()) as u32,
                _ => (parseuint_arith2le(u16::from_le_bytes(self[0..2].try_into().unwrap())) as u32) * 1_0000_0000 + (parseuint_raw8b(self[2..10].try_into().unwrap()) as u32),
            }
        }
        // parse_u16_raw: empty or int(self) > u16::MAX or self.len() > 5 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        #[inline(always)]
        fn parse_u16_raw(&self) -> u16 {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 5);
            invariant!(self.iter().all(u8::is_ascii_digit));
            parseuint_raw7b(&self) as u16
        }
        // parse_u8_raw: empty or int(self) > u8::MAX or self.len() > 3 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        #[inline(always)]
        fn parse_u8_raw(&self) -> u8 {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 3);
            invariant!(self.iter().all(u8::is_ascii_digit));
            parseuint_raw3b(&self) as u8
        }
        #[inline(always)]
        fn parse_i128_raw(&self) -> i128 {
            invariant!(!self.is_empty());
            if self.is_empty() {
                0
            } else if self[0] == b'-' {
                (&self[1..]).parse_u128_raw().wrapping_neg() as i128
            } else {
                self.parse_u128_raw() as i128
            }
        }
        #[inline(always)]
        fn parse_i64_raw(&self) -> i64 {
            invariant!(!self.is_empty());
            if self.is_empty() {
                0
            } else if self[0] == b'-' {
                (&self[1..]).parse_u64_raw().wrapping_neg() as i64
            } else {
                self.parse_u64_raw() as i64
            }
        }
        #[inline(always)]
        fn parse_i32_raw(&self) -> i32 {
            invariant!(!self.is_empty());
            if self.is_empty() {
                0
            } else if self[0] == b'-' {
                (&self[1..]).parse_u32_raw().wrapping_neg() as i32
            } else {
                self.parse_u32_raw() as i32
            }
        }
        #[inline(always)]
        fn parse_i16_raw(&self) -> i16 {
            invariant!(!self.is_empty());
            if self.is_empty() {
                0
            } else if self[0] == b'-' {
                (&self[1..]).parse_u16_raw().wrapping_neg() as i16
            } else {
                self.parse_u16_raw() as i16
            }
        }
        #[inline(always)]
        fn parse_i8_raw(&self) -> i8 {
            invariant!(!self.is_empty());
            if self.is_empty() {
                0
            } else if self[0] == b'-' {
                (&self[1..]).parse_u128_raw().wrapping_neg() as i8
            } else {
                self.parse_u128_raw() as i8
            }
        }
        // parse_u128_rawopt: empty or int(self) > u128::MAX or self.len() > 39 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        fn parse_u128_rawopt(&self) -> Option<u128> {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 39);
            invariant!(self.iter().all(u8::is_ascii_digit));
            let (s15, s16) = self.split_at(self.len() % 16);
            let r = match s15.len() / 4 {
                0 => s15.iter().fold(0, |p, &c| p * 10 + ((c & 0x0f) as u64)),
                1 => {
                    if self.len() < 4 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    s15[4..].iter().fold(
                        parseuint_raw4b(s15[0..4].try_into().unwrap()) as u64,
                        |p, &c| p * 10 + ((c & 0x0f) as u64),
                    )
                }
                2 => {
                    if self.len() < 8 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    s15[8..]
                        .iter()
                        .fold(parseuint_raw8b(s15[0..8].try_into().unwrap()), |p, &c| {
                            p * 10 + ((c & 0x0f) as u64)
                        })
                }
                _ => {
                    if self.len() < 12 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    s15[12..].iter().fold(
                        parseuint_raw8b(s15[0..8].try_into().unwrap()) * 10000
                            + parseuint_raw4b(s15[8..12].try_into().unwrap()) as u64,
                        |p, &c| p * 10 + ((c & 0x0f) as u64),
                    )
                }
            };
            match s16.len() {
                0 => Some(r as u128),
                16 => Some(
                    (r as u128) * 10000000000000000
                        + parseuint_raw16b(s16.try_into().unwrap()) as u128,
                ),
                32 => (r as u128)
                    .checked_mul(100000000000000000000000000000000)?
                    .checked_add(parseuint_raw32b(s16.try_into().unwrap())),
                _ => None,
            }
        }
        // parse_u64_rawopt: empty or int(self) > u64::MAX or self.len() > 20 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        fn parse_u64_rawopt(&self) -> Option<u64> {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 20);
            invariant!(self.iter().all(u8::is_ascii_digit));
            match self.len() / 4 {
                0 => Some(self.iter().fold(0, |p, &c| p * 10 + ((c & 0x0f) as u64))),
                1 => {
                    if self.len() < 4 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    Some(self[4..].iter().fold(
                        parseuint_raw4b(self[0..4].try_into().unwrap()) as u64,
                        |p, &c| p * 10 + ((c & 0x0f) as u64),
                    ))
                }
                2 => {
                    if self.len() < 8 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    Some(
                        self[8..]
                            .iter()
                            .fold(parseuint_raw8b(self[0..8].try_into().unwrap()), |p, &c| {
                                p * 10 + ((c & 0x0f) as u64)
                            }),
                    )
                }
                3 => {
                    if self.len() < 12 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    Some(self[12..].iter().fold(
                        parseuint_raw8b(self[0..8].try_into().unwrap()) * 10000
                            + parseuint_raw4b(self[8..12].try_into().unwrap()) as u64,
                        |p, &c| p * 10 + ((c & 0x0f) as u64),
                    ))
                }
                4 => {
                    if self.len() < 16 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    Some(self[16..].iter().fold(
                        parseuint_raw16b(self[0..16].try_into().unwrap()),
                        |p, &c| p * 10 + ((c & 0x0f) as u64),
                    ))
                }
                5 => {
                    if self.len() < 20 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    self[20..].iter().fold(
                        parseuint_raw16b(self[0..16].try_into().unwrap())
                            .checked_mul(10000)?
                            .checked_add(parseuint_raw4b(self[16..20].try_into().unwrap()) as u64),
                        |p, &c| p?.checked_mul(10)?.checked_add((c & 0x0f) as u64),
                    )
                }
                _ => None,
            }
        }
        // parse_u32_rawopt: empty or int(self) > u32::MAX or self.len() > 10 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        fn parse_u32_rawopt(&self) -> Option<u32> {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 10);
            invariant!(self.iter().all(u8::is_ascii_digit));
            match self.len() / 4 {
                0 => Some(self.iter().fold(0, |p, &c| p * 10 + ((c & 0x0f) as u32))),
                1 => {
                    if self.len() < 4 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    Some(self[4..].iter().fold(
                        parseuint_raw4b(self[0..4].try_into().unwrap()) as u32,
                        |p, &c| p * 10 + ((c & 0x0f) as u32),
                    ))
                }
                2 => {
                    if self.len() < 8 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    self[8..].iter().fold(
                        Some(parseuint_raw8b(self[0..8].try_into().unwrap()) as u32),
                        |p, &c| p?.checked_mul(10)?.checked_add((c & 0x0f) as u32),
                    )
                }
                _ => None,
            }
        }
        // parse_u16_rawopt: empty or int(self) > u16::MAX or self.len() > 5 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        fn parse_u16_rawopt(&self) -> Option<u16> {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 5);
            invariant!(self.iter().all(u8::is_ascii_digit));
            match self.len() / 4 {
                0 => Some(self.iter().fold(0, |p, &c| p * 10 + ((c & 0x0f) as u16))),
                1 => {
                    if self.len() < 4 {
                        unsafe { core::hint::unreachable_unchecked() }
                    }
                    self[4..].iter().fold(
                        Some(parseuint_raw4b(self[0..4].try_into().unwrap()) as u16),
                        |p, &c| p?.checked_mul(10)?.checked_add((c & 0x0f) as u16),
                    )
                }
                _ => None,
            }
        }
        // parse_u8_rawopt: empty or int(self) > u8::MAX or self.len() > 3 or !self.iter().all(u8::is_ascii_digit) will cause Undefined Behavior.
        fn parse_u8_rawopt(&self) -> Option<u8> {
            invariant!(!self.is_empty());
            invariant!(self.len() <= 3);
            invariant!(self.iter().all(u8::is_ascii_digit));
            match self.len() {
                0..=2 => Some(self.iter().fold(0, |p, &c| p * 10 + (c & 0x0f))),
                3 => ((self[0] & 0x0f) * 10 + (self[1] & 0x0f))
                    .checked_mul(10)?
                    .checked_add(self[2] & 0x0f),
                _ => None,
            }
        }
    }
    /// speed frenzy input parser for program compete
    pub trait ProconParse {
        fn get_ascii_byte(&mut self) -> u8 {
            self.get_ascii_byte_opt().unwrap()
        }
        fn get_ascii_byte_or_default(&mut self) -> u8 {
            self.get_ascii_byte_opt().unwrap_or_default()
        }
        fn get_ascii_byte_opt(&mut self) -> Option<u8>;
        fn parse_uint<U: UPrimInt>(&mut self) -> U {
            self.parse_uint_opt().unwrap()
        }
        fn parse_uint_or_default<U: UPrimInt>(&mut self) -> U {
            self.parse_uint_opt().unwrap_or_default()
        }
        fn parse_uint_opt<U: UPrimInt>(&mut self) -> Option<U>;
        fn parse_iint<I: IPrimInt>(&mut self) -> I {
            self.parse_iint_opt().unwrap()
        }
        fn parse_iint_or_default<I: IPrimInt>(&mut self) -> I {
            self.parse_iint_opt().unwrap_or_default()
        }
        fn parse_iint_opt<I: IPrimInt>(&mut self) -> Option<I>;
    }
    impl<T: Iterator<Item = u8>> ProconParse for T {
        fn get_ascii_byte_opt(&mut self) -> Option<u8> {
            loop {
                match self.next() {
                    Some(c @ 0x21..=0x7e) => {
                        return Some(c);
                    }
                    Some(_) => continue,
                    _ => return None,
                }
            }
        }
        fn parse_uint_opt<U: UPrimInt>(&mut self) -> Option<U> {
            loop {
                match self.next() {
                    Some(c @ b'0'..=b'9') => {
                        let mut v = U::from(c - b'0');
                        while let Some(c @ b'0'..=b'9') = self.next() {
                            v = v * U::from(10) + U::from(c - b'0');
                        }
                        return Some(v);
                    }
                    Some(_) => continue,
                    _ => return None,
                }
            }
        }
        fn parse_iint_opt<I: IPrimInt>(&mut self) -> Option<I> {
            loop {
                match self.next() {
                    Some(c @ b'0'..=b'9') => {
                        let mut v = I::from((c - b'0') as i8);
                        while let Some(c @ b'0'..=b'9') = self.next() {
                            v = v * I::from(10) + I::from((c - b'0') as i8);
                        }
                        return Some(v);
                    }
                    Some(b'-') => match self.next() {
                        Some(c @ b'0'..=b'9') => {
                            let mut v = I::from(-((c - b'0') as i8));
                            while let Some(c @ b'0'..=b'9') = self.next() {
                                v = v * I::from(10) - I::from((c - b'0') as i8);
                            }
                            return Some(v);
                        }
                        _ => return None,
                    },
                    Some(_) => continue,
                    _ => return None,
                }
            }
        }
    }
    impl<R: std::io::BufRead> Drop for ProconIBufIter<R> {
        /// Saving the pointer on interruption
        fn drop(&mut self) {
            self.inner
                .consume(unsafe { ptr_offset_u8(self.ptr, self.raw) });
        }
    }
    /// Insufficient write buffer size causes undefined operation.
    pub struct ProconWriteBuffer(*mut u8, Vec<u8>, Dec4le);
    impl ProconWriteBuffer {
        pub fn with_capacity(capacity: usize) -> Self {
            let mut b = Vec::<u8>::with_capacity(capacity);
            let ptr = b.as_mut_ptr();
            Self(ptr, b, Dec4le::new())
        }
        pub fn get_mut_ptr(&self) -> *mut u8 {
            self.0
        }
        pub fn set_mut_ptr(&mut self, p: *mut u8) {
            self.0 = p;
        }
        fn decision(&mut self) {
            let bptr = self.1.as_mut_ptr();
            unsafe { self.1.set_len((self.0 as usize) - (bptr as usize)) };
        }
        pub fn clear(&mut self) {
            self.1.clear();
            self.0 = self.1.as_mut_ptr();
        }
        pub fn get_slice(&mut self) -> &[u8] {
            self.decision();
            self.1.as_slice()
        }
        pub fn reserve(&mut self, additional: usize) {
            self.decision();
            self.1.reserve(additional);
            self.0 = self.1.as_mut_ptr();
        }
        pub fn reserve_exact(&mut self, additional: usize) {
            self.decision();
            self.1.reserve_exact(additional);
            self.0 = self.1.as_mut_ptr();
        }
        pub fn uint<U>(&mut self, d: U)
        where
            U: UPrimInt + std::convert::Into<u128>,
        {
            match U::BITS {
                0..=64 => unsafe {
                    self.2
                        .rawbytes_ow_u64(&mut self.0, Into::<u128>::into(d) as u64)
                },
                _ => unsafe { self.2.rawbytes_ow_u128(&mut self.0, Into::<u128>::into(d)) },
            }
        }
        pub fn uint_sp<U>(&mut self, s: &[U])
        where
            U: UPrimInt + std::convert::Into<u128>,
        {
            if s.is_empty() {
                return;
            }
            let mut p = self.0;
            for &d in s.iter() {
                match U::BITS {
                    0..=64 => unsafe {
                        self.2
                            .rawbytes_spow_u64(&mut p, Into::<u128>::into(d) as u64)
                    },
                    _ => unsafe { self.2.rawbytes_spow_u128(&mut p, Into::<u128>::into(d)) },
                }
            }
            self.0 = unsafe { p.sub(1) };
        }
        pub fn uint_splf<U>(&mut self, s: &[U])
        where
            U: UPrimInt + std::convert::Into<u128>,
        {
            if s.is_empty() {
                proconwritebuf_lf(&mut self.0);
                return;
            }
            let mut p = self.0;
            for &d in s.iter() {
                match U::BITS {
                    0..=64 => unsafe {
                        self.2
                            .rawbytes_spow_u64(&mut p, Into::<u128>::into(d) as u64)
                    },
                    _ => unsafe { self.2.rawbytes_spow_u128(&mut p, Into::<u128>::into(d)) },
                }
            }
            unsafe { *p.sub(1) = b'\n' };
            self.0 = p;
        }
        pub fn usize(&mut self, d: usize) {
            unsafe { self.2.rawbytes_ow_u64(&mut self.0, d as u64) };
        }
        pub fn usize_sp(&mut self, s: &[usize]) {
            if s.is_empty() {
                return;
            }
            let mut p = self.0;
            for &d in s.iter() {
                unsafe { self.2.rawbytes_spow_u64(&mut p, d as u64) };
            }
            self.0 = unsafe { p.sub(1) };
        }
        pub fn usize_splf(&mut self, s: &[usize]) {
            if s.is_empty() {
                proconwritebuf_lf(&mut self.0);
                return;
            }
            let mut p = self.0;
            for &d in s.iter() {
                unsafe { self.2.rawbytes_spow_u64(&mut p, d as u64) };
            }
            unsafe { *p.sub(1) = b'\n' };
            self.0 = p;
        }
        pub fn iint<I>(&mut self, d: I)
        where
            I: IPrimInt + std::convert::Into<i128>,
        {
            match I::BITS {
                0..=64 => unsafe {
                    self.2
                        .rawbytes_ow_i64(&mut self.0, Into::<i128>::into(d) as i64)
                },
                _ => unsafe { self.2.rawbytes_ow_i128(&mut self.0, Into::<i128>::into(d)) },
            }
        }
        pub fn iint_sp<I>(&mut self, s: &[I])
        where
            I: IPrimInt + std::convert::Into<i128>,
        {
            if s.is_empty() {
                return;
            }
            let mut p = self.0;
            for &d in s.iter() {
                match I::BITS {
                    0..=64 => unsafe {
                        self.2
                            .rawbytes_spow_i64(&mut p, Into::<i128>::into(d) as i64)
                    },
                    _ => unsafe { self.2.rawbytes_spow_i128(&mut p, Into::<i128>::into(d)) },
                }
            }
            self.0 = unsafe { p.sub(1) };
        }
        pub fn iint_splf<I>(&mut self, s: &[I])
        where
            I: IPrimInt + std::convert::Into<i128> + std::convert::TryInto<u8>,
        {
            if s.is_empty() {
                proconwritebuf_lf(&mut self.0);
                return;
            }
            let mut p = self.0;
            for &d in s.iter() {
                match I::BITS {
                    0..=64 => unsafe {
                        self.2
                            .rawbytes_spow_i64(&mut p, Into::<i128>::into(d) as i64)
                    },
                    _ => unsafe { self.2.rawbytes_spow_i128(&mut p, Into::<i128>::into(d)) },
                }
            }
            unsafe { *p.sub(1) = b'\n' };
            self.0 = p;
        }
        pub fn sp(&mut self) {
            proconwritebuf_sp(&mut self.0);
        }
        pub fn lf(&mut self) {
            proconwritebuf_lf(&mut self.0);
        }
        pub fn bytes(&mut self, s: &[u8]) {
            proconwritebuf_bytes(&mut self.0, s);
        }
        pub fn str(&mut self, s: &str) {
            proconwritebuf_str(&mut self.0, s);
        }
        pub fn string(&mut self, s: &String) {
            proconwritebuf_string(&mut self.0, s);
        }
        pub fn write_all<W>(&mut self, out: &mut W)
        where
            W: std::io::Write,
        {
            self.decision();
            let _ = out.write_all(self.1.as_slice());
            self.1.clear();
            self.0 = self.1.as_mut_ptr();
        }
    }
    pub fn proconwritebuf_sp(p: &mut *mut u8) {
        *p = unsafe {
            **p = b' ';
            (*p).add(1)
        }
    }
    pub fn proconwritebuf_lf(p: &mut *mut u8) {
        *p = unsafe {
            **p = b'\n';
            (*p).add(1)
        }
    }
    pub fn proconwritebuf_bytes(p: &mut *mut u8, bytes: &[u8]) {
        *p = unsafe {
            let len = bytes.len();
            std::ptr::copy_nonoverlapping(bytes.as_ptr(), *p, len);
            (*p).add(len)
        };
    }
    pub fn proconwritebuf_str(p: &mut *mut u8, s: &str) {
        *p = unsafe {
            let len = s.len();
            std::ptr::copy_nonoverlapping(s.as_ptr(), *p, len);
            (*p).add(len)
        };
    }
    pub fn proconwritebuf_string(p: &mut *mut u8, s: &String) {
        *p = unsafe {
            let len = s.len();
            std::ptr::copy_nonoverlapping(s.as_ptr(), *p, len);
            (*p).add(len)
        };
    }
    pub struct Dec4le((), (), [u32; 100], [u32; 1000], [u32; 10000]);
    //pub const DEC4LE: Dec4le = Dec4le::new();
    impl Dec4le {
        pub fn new() -> Self {
            // const fn while: Rust 1.46.0 or later
            let (mut d2, mut i) = ([0u32; 100], 0);
            while i < 100 {
                d2[i as usize] = ((i % 10) << 8) | (i / 10) | 0x0020_3030;
                i += 1;
            }
            let (mut d3, mut i) = ([0u32; 1000], 0);
            while i < 1000 {
                let (dh, dl) = (i / 100, i % 100);
                d3[i as usize] = ((dl % 10) << 16) | ((dl / 10) << 8) | dh | 0x2030_3030;
                i += 1;
            }
            let (mut d4, mut i) = ([0u32; 10000], 0);
            while i < 1_0000 {
                let (dh, dl) = (i / 100, i % 100);
                d4[i as usize] = 0x30303030
                    | (dh / 10)
                    | ((dh % 10) << 8)
                    | ((dl / 10) << 16)
                    | ((dl % 10) << 24);
                i += 1;
            }
            Self((), (), d2, d3, d4)
        }
        #[inline(always)]
        unsafe fn rawbytes_d1(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 10);
            **v = b'0' | x as u8;
            *v = v.add(1);
        }
        #[inline(always)]
        unsafe fn rawbytes_d2(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 100);
            let s = (((x * 103 >> 10) * 246 + x) as u16 | 0x3030).to_be_bytes();
            v.copy_from_nonoverlapping(s.as_ptr(), 2);
            *v = v.add(2);
        }
        #[inline(always)]
        unsafe fn rawbytes_d3(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1000);
            v.copy_from_nonoverlapping(self.3[x as usize].to_le_bytes().as_ptr(), 3);
            *v = v.add(3);
        }
        #[inline(always)]
        unsafe fn rawbytes_d3ow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1000);
            v.copy_from_nonoverlapping(self.3[x as usize].to_le_bytes().as_ptr(), 4);
            *v = v.add(3);
        }
        #[inline(always)]
        unsafe fn rawbytes_d4(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000);
            v.copy_from_nonoverlapping(self.4[x as usize].to_le_bytes().as_ptr(), 4);
            *v = v.add(4);
        }
        #[inline(always)]
        unsafe fn rawbytes_d5(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 10_0000);
            let (y0, y1) = (x / 10, x % 10);
            v.copy_from_nonoverlapping(
                (((y1 as u64) << 32) | (self.4[y0 as usize] as u64) | 0x0030_0000_0000)
                    .to_le_bytes()
                    .as_ptr(),
                5,
            );
            *v = v.add(5);
        }
        #[inline(always)]
        unsafe fn rawbytes_d5ow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 10_0000);
            let (y0, y1) = (x / 10, x % 10);
            v.copy_from_nonoverlapping(
                (((y1 as u64) << 32) | (self.4[y0 as usize] as u64) | 0x0030_0000_0000)
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v = v.add(5);
        }
        #[inline(always)]
        unsafe fn rawbytes_d6(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 100_0000);
            let (y0, y1) = (x / 100, x % 100);
            v.copy_from_nonoverlapping(
                ((((self.2[y1 as usize] as u16) as u64) << 32) | (self.4[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                6,
            );
            *v = v.add(6);
        }
        #[inline(always)]
        unsafe fn rawbytes_d6ow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 100_0000);
            let (y0, y1) = (x / 100, x % 100);
            v.copy_from_nonoverlapping(
                ((((self.2[y1 as usize] as u16) as u64) << 32) | (self.4[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v = v.add(6);
        }
        #[inline(always)]
        unsafe fn rawbytes_d7(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1000_0000);
            let (y0, y1) = (x / 1000, x % 1000);
            v.copy_from_nonoverlapping(
                (((self.3[y1 as usize] as u64) << 32) | (self.4[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                7,
            );
            *v = v.add(7);
        }
        #[inline(always)]
        unsafe fn rawbytes_d7ow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1000_0000);
            let (y0, y1) = (x / 1000, x % 1000);
            v.copy_from_nonoverlapping(
                (((self.3[y1 as usize] as u64) << 32) | (self.4[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v = v.add(7);
        }
        #[inline(always)]
        unsafe fn rawbytes_d8(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000_0000);
            let (y0, y1) = (x / 1_0000, x % 1_0000);
            v.copy_from_nonoverlapping(
                (((self.4[y1 as usize] as u64) << 32) | (self.4[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v = v.add(8);
        }
        #[inline(always)]
        unsafe fn rawbytes_d16(&self, v: &mut *mut u8, x: u64) {
            invariant!(x < 1_0000_0000_0000_0000);
            let (y0, y1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
            let (z0, z1, z2, z3) = (y0 / 1_0000, y0 % 1_0000, y1 / 1_0000, y1 % 1_0000);
            invariant!(z0 < 1_0000 && z1 < 1_0000 && z2 < 1_0000 && z3 < 1_0000);
            v.copy_from_nonoverlapping(
                (((self.4[z3 as usize] as u128) << 96)
                    | ((self.4[z2 as usize] as u128) << 64)
                    | ((self.4[z1 as usize] as u128) << 32)
                    | (self.4[z0 as usize] as u128))
                    .to_le_bytes()
                    .as_ptr(),
                16,
            );
            *v = v.add(16);
        }
        #[inline(always)]
        unsafe fn rawbytes_d1sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 10);
            v.copy_from_nonoverlapping(((x as u16) | 0x2030).to_le_bytes().as_ptr(), 2);
            *v = v.add(2);
        }
        #[inline(always)]
        unsafe fn rawbytes_d2sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 100);
            v.copy_from_nonoverlapping(self.2[x as usize].to_le_bytes().as_ptr(), 2);
            *v.add(2) = b' ';
            *v = v.add(3);
        }
        #[inline(always)]
        unsafe fn rawbytes_d2spow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 100);
            v.copy_from_nonoverlapping(self.2[x as usize].to_le_bytes().as_ptr(), 4);
            *v = v.add(3);
        }
        #[inline(always)]
        unsafe fn rawbytes_d3sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1000);
            v.copy_from_nonoverlapping(self.3[x as usize].to_le_bytes().as_ptr(), 4);
            *v = v.add(4);
        }
        #[inline(always)]
        unsafe fn rawbytes_d4sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000);
            v.copy_from_nonoverlapping(self.4[x as usize].to_le_bytes().as_ptr(), 4);
            *v.add(4) = b' ';
            *v = v.add(5);
        }
        #[inline(always)]
        unsafe fn rawbytes_d5sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 10_0000);
            let (y0, y1) = (x / 10, x % 10);
            v.copy_from_nonoverlapping(
                (((y1 as u64) << 32) | (self.4[y0 as usize] as u64) | 0x2030_0000_0000)
                    .to_le_bytes()
                    .as_ptr(),
                6,
            );
            *v = v.add(6);
        }
        #[inline(always)]
        unsafe fn rawbytes_d5spow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 10_0000);
            let (y0, y1) = (x / 10, x % 10);
            v.copy_from_nonoverlapping(
                (((y1 as u64) << 32) | (self.4[y0 as usize] as u64) | 0x2030_0000_0000)
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v = v.add(6);
        }
        #[inline(always)]
        unsafe fn rawbytes_d6sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 100_0000);
            let (y0, y1) = (x / 1000, x % 1000);
            v.copy_from_nonoverlapping(
                (((self.3[y1 as usize] as u64) << 24) | (self.3[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                7,
            );
            *v = v.add(7);
        }
        #[inline(always)]
        unsafe fn rawbytes_d6spow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 100_0000);
            let (y0, y1) = (x / 1000, x % 1000);
            v.copy_from_nonoverlapping(
                (((self.3[y1 as usize] as u64) << 24) | (self.3[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v = v.add(7);
        }
        #[inline(always)]
        unsafe fn rawbytes_d7sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1000_0000);
            let (y0, y1) = (x / 1000, x % 1000);
            v.copy_from_nonoverlapping(
                (((self.3[y1 as usize] as u64) << 32) | (self.4[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v = v.add(8);
        }
        #[inline(always)]
        unsafe fn rawbytes_d8sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000_0000);
            let (y0, y1) = (x / 1_0000, x % 1_0000);
            v.copy_from_nonoverlapping(
                (((self.4[y1 as usize] as u64) << 32) | (self.4[y0 as usize] as u64))
                    .to_le_bytes()
                    .as_ptr(),
                8,
            );
            *v.add(8) = b' ';
            *v = v.add(9);
        }
        #[inline(always)]
        unsafe fn rawbytes_d16sp(&self, v: &mut *mut u8, x: u64) {
            invariant!(x < 1_0000_0000_0000_0000);
            let (y0, y1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
            let (z0, z1, z2, z3) = (y0 / 1_0000, y0 % 1_0000, y1 / 1_0000, y1 % 1_0000);
            invariant!(z0 < 1_0000 && z1 < 1_0000 && z2 < 1_0000 && z3 < 1_0000);
            v.copy_from_nonoverlapping(
                (((self.4[z3 as usize] as u128) << 96)
                    | ((self.4[z2 as usize] as u128) << 64)
                    | ((self.4[z1 as usize] as u128) << 32)
                    | (self.4[z0 as usize] as u128))
                    .to_le_bytes()
                    .as_ptr(),
                16,
            );
            *v.add(16) = b' ';
            *v = v.add(17);
        }
        #[inline(always)]
        pub unsafe fn rawbytes_d8less(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000_0000);
            match x {
                0..=9 => self.rawbytes_d1(v, x),
                10..=99 => self.rawbytes_d2(v, x),
                100..=999 => self.rawbytes_d3(v, x),
                1000..=9999 => self.rawbytes_d4(v, x),
                1_0000..=9_9999 => self.rawbytes_d5(v, x),
                10_0000..=99_9999 => self.rawbytes_d6(v, x),
                100_0000..=999_9999 => self.rawbytes_d7(v, x),
                1000_0000..=9999_9999 => self.rawbytes_d8(v, x),
                _ => core::hint::unreachable_unchecked(),
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_d8less_ow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000_0000);
            match x {
                0..=9 => self.rawbytes_d1(v, x),
                10..=99 => self.rawbytes_d2(v, x),
                100..=999 => self.rawbytes_d3ow(v, x),
                1000..=9999 => self.rawbytes_d4(v, x),
                1_0000..=9_9999 => self.rawbytes_d5ow(v, x),
                10_0000..=99_9999 => self.rawbytes_d6ow(v, x),
                100_0000..=999_9999 => self.rawbytes_d7ow(v, x),
                1000_0000..=9999_9999 => self.rawbytes_d8(v, x),
                _ => core::hint::unreachable_unchecked(),
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_d8less_sp(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000_0000);
            match x {
                0..=9 => self.rawbytes_d1sp(v, x),
                10..=99 => self.rawbytes_d2sp(v, x),
                100..=999 => self.rawbytes_d3sp(v, x),
                1000..=9999 => self.rawbytes_d4sp(v, x),
                1_0000..=9_9999 => self.rawbytes_d5sp(v, x),
                10_0000..=99_9999 => self.rawbytes_d6sp(v, x),
                100_0000..=999_9999 => self.rawbytes_d7sp(v, x),
                1000_0000..=9999_9999 => self.rawbytes_d8sp(v, x),
                _ => core::hint::unreachable_unchecked(),
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_d8less_spow(&self, v: &mut *mut u8, x: u32) {
            invariant!(x < 1_0000_0000);
            match x {
                0..=9 => self.rawbytes_d1sp(v, x),
                10..=99 => self.rawbytes_d2spow(v, x),
                100..=999 => self.rawbytes_d3sp(v, x),
                1000..=9999 => self.rawbytes_d4sp(v, x),
                1_0000..=9_9999 => self.rawbytes_d5spow(v, x),
                10_0000..=99_9999 => self.rawbytes_d6spow(v, x),
                100_0000..=999_9999 => self.rawbytes_d7sp(v, x),
                1000_0000..=9999_9999 => self.rawbytes_d8sp(v, x),
                _ => core::hint::unreachable_unchecked(),
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_u64(&self, v: &mut *mut u8, x: u64) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        x % 1_0000_0000_0000_0000,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, y1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_ow_u64(&self, v: &mut *mut u8, x: u64) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less_ow(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        x % 1_0000_0000_0000_0000,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, y1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_sp_u64(&self, v: &mut *mut u8, x: u64) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less_sp(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8sp(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        x % 1_0000_0000_0000_0000,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16sp(v, y1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_spow_u64(&self, v: &mut *mut u8, x: u64) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less_spow(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8sp(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        x % 1_0000_0000_0000_0000,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16sp(v, y1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_u128(&self, v: &mut *mut u8, x: u128) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        (x % 1_0000_0000_0000_0000) as u64,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, y1);
                }
                1844_6744_0737_0955_1616..=9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u32;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000..=9999_9999_9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u64;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    let (z0, z1) = ((y0 / 1_0000_0000) as u32, (y0 % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                    self.rawbytes_d16(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000_0000_0000
                    ..=340_2823_6692_0938_4634_6337_4607_4317_6821_1455 => {
                    let y0 = (x / 1_0000_0000_0000_0000_0000_0000_0000_0000) as u32;
                    let y1 = x - (y0 as u128) * 1_0000_0000_0000_0000_0000_0000_0000_0000;
                    let z0 = (y1 / 1_0000_0000_0000_0000) as u64;
                    let z1 = (y1 - (z0 as u128) * 1_0000_0000_0000_0000) as u64;
                    invariant!(y0 < 340_2824);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, z0);
                    self.rawbytes_d16(v, z1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_ow_u128(&self, v: &mut *mut u8, x: u128) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less_ow(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        (x % 1_0000_0000_0000_0000) as u64,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, y1);
                }
                1844_6744_0737_0955_1616..=9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u32;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000..=9999_9999_9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u64;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    let (z0, z1) = ((y0 / 1_0000_0000) as u32, (y0 % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                    self.rawbytes_d16(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000_0000_0000
                    ..=340_2823_6692_0938_4634_6337_4607_4317_6821_1455 => {
                    let y0 = (x / 1_0000_0000_0000_0000_0000_0000_0000_0000) as u32;
                    let y1 = x - (y0 as u128) * 1_0000_0000_0000_0000_0000_0000_0000_0000;
                    let z0 = (y1 / 1_0000_0000_0000_0000) as u64;
                    let z1 = (y1 - (z0 as u128) * 1_0000_0000_0000_0000) as u64;
                    invariant!(y0 < 340_2824);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, z0);
                    self.rawbytes_d16(v, z1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_sp_u128(&self, v: &mut *mut u8, x: u128) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less_sp(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8sp(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        (x % 1_0000_0000_0000_0000) as u64,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16sp(v, y1);
                }
                1844_6744_0737_0955_1616..=9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u32;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16sp(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000..=9999_9999_9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u64;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    let (z0, z1) = ((y0 / 1_0000_0000) as u32, (y0 % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                    self.rawbytes_d16sp(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000_0000_0000
                    ..=340_2823_6692_0938_4634_6337_4607_4317_6821_1455 => {
                    let y0 = (x / 1_0000_0000_0000_0000_0000_0000_0000_0000) as u32;
                    let y1 = x - (y0 as u128) * 1_0000_0000_0000_0000_0000_0000_0000_0000;
                    let z0 = (y1 / 1_0000_0000_0000_0000) as u64;
                    let z1 = (y1 - (z0 as u128) * 1_0000_0000_0000_0000) as u64;
                    invariant!(y0 < 340_2824);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, z0);
                    self.rawbytes_d16sp(v, z1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_spow_u128(&self, v: &mut *mut u8, x: u128) {
            match x {
                0..=9999_9999 => self.rawbytes_d8less_spow(v, x as u32),
                1_0000_0000..=9999_9999_9999_9999 => {
                    let (z0, z1) = ((x / 1_0000_0000) as u32, (x % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8sp(v, z1);
                }
                1_0000_0000_0000_0000..=1844_6744_0737_0955_1615 => {
                    let (y0, y1) = (
                        (x / 1_0000_0000_0000_0000) as u32,
                        (x % 1_0000_0000_0000_0000) as u64,
                    );
                    invariant!(y0 < 1845);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16sp(v, y1);
                }
                1844_6744_0737_0955_1616..=9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u32;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16sp(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000..=9999_9999_9999_9999_9999_9999_9999_9999 => {
                    let y0 = (x / 1_0000_0000_0000_0000) as u64;
                    let y1 = (x - (y0 as u128) * 1_0000_0000_0000_0000) as u64;
                    let (z0, z1) = ((y0 / 1_0000_0000) as u32, (y0 % 1_0000_0000) as u32);
                    self.rawbytes_d8less_ow(v, z0);
                    self.rawbytes_d8(v, z1);
                    self.rawbytes_d16sp(v, y1);
                }
                1_0000_0000_0000_0000_0000_0000_0000_0000
                    ..=340_2823_6692_0938_4634_6337_4607_4317_6821_1455 => {
                    let y0 = (x / 1_0000_0000_0000_0000_0000_0000_0000_0000) as u32;
                    let y1 = x - (y0 as u128) * 1_0000_0000_0000_0000_0000_0000_0000_0000;
                    let z0 = (y1 / 1_0000_0000_0000_0000) as u64;
                    let z1 = (y1 - (z0 as u128) * 1_0000_0000_0000_0000) as u64;
                    invariant!(y0 < 340_2824);
                    self.rawbytes_d8less_ow(v, y0);
                    self.rawbytes_d16(v, z0);
                    self.rawbytes_d16sp(v, z1);
                }
            }
        }
        #[inline(always)]
        pub unsafe fn rawbytes_ow_i64(&self, v: &mut *mut u8, x: i64) {
            let x = if x < 0 {
                **v = b'-';
                *v = v.add(1);
                x.wrapping_neg() as u64
            } else {
                x as u64
            };
            self.rawbytes_ow_u64(v, x);
        }
        #[inline(always)]
        pub unsafe fn rawbytes_sp_i64(&self, v: &mut *mut u8, x: i64) {
            let x = if x < 0 {
                **v = b'-';
                *v = v.add(1);
                x.wrapping_neg() as u64
            } else {
                x as u64
            };
            self.rawbytes_sp_u64(v, x);
        }
        #[inline(always)]
        pub unsafe fn rawbytes_spow_i64(&self, v: &mut *mut u8, x: i64) {
            let x = if x < 0 {
                **v = b'-';
                *v = v.add(1);
                x.wrapping_neg() as u64
            } else {
                x as u64
            };
            self.rawbytes_spow_u64(v, x);
        }
        #[inline(always)]
        pub unsafe fn rawbytes_ow_i128(&self, v: &mut *mut u8, x: i128) {
            let x = if x < 0 {
                **v = b'-';
                *v = v.add(1);
                x.wrapping_neg() as u128
            } else {
                x as u128
            };
            self.rawbytes_ow_u128(v, x);
        }
        #[inline(always)]
        pub unsafe fn rawbytes_sp_i128(&self, v: &mut *mut u8, x: i128) {
            let x = if x < 0 {
                **v = b'-';
                *v = v.add(1);
                x.wrapping_neg() as u128
            } else {
                x as u128
            };
            self.rawbytes_sp_u128(v, x);
        }
        #[inline(always)]
        pub unsafe fn rawbytes_spow_i128(&self, v: &mut *mut u8, x: i128) {
            let x = if x < 0 {
                **v = b'-';
                *v = v.add(1);
                x.wrapping_neg() as u128
            } else {
                x as u128
            };
            self.rawbytes_spow_u128(v, x);
        }
    }
}

#[cfg(not(target_os = "linux"))]
pub fn print(s: &[u8]) {
    std::io::Write::write_all(&mut std::io::stdout(), s).unwrap();
}
#[cfg(not(target_os = "linux"))]
#[allow(unused)]
pub fn print_err(s: &[u8]) {
    std::io::Write::write_all(&mut std::io::stderr(), s).unwrap();
}
#[cfg(not(target_os = "linux"))]
#[no_mangle]
pub fn ilaunch() {
    let stdin = std::io::stdin();
    solve(&mut fastproconio::ProconIBufIter::new(stdin.lock()));
}

#[cfg(target_os = "linux")]
pub fn print(s: &[u8]) {
    unsafe { write(1, s.as_ptr(), s.len()) };
}
#[cfg(target_os = "linux")]
pub fn print_err(s: &[u8]) {
    unsafe { write(2, s.as_ptr(), s.len()) };
}
#[cfg(target_os = "linux")]
#[link(name = "c")]
#[rustfmt::skip]
extern "C" {
    pub fn mmap(addr: *mut u8, length: usize, prot: i32, flags: i32, fd: i32, off: isize) -> *mut u8;
    pub fn munmap(addr: *mut u8, length: usize) -> i32;
    pub fn read(fd: i32, buf: *mut u8, len: usize) -> usize;
    pub fn write(fd: i32, s: *const u8, len: usize);
}
#[cfg(target_os = "linux")]
pub fn ilaunch() {
    unsafe {
        use std::os::unix::io::FromRawFd;
        match std::fs::File::from_raw_fd(0).metadata() {
            Ok(metadata) if metadata.is_file() => {
                let filelen = metadata.len();
                let input = mmap(std::ptr::null_mut(), filelen as usize, 1, 2, 0, 0);
                solve(&mut fastproconio::BytesIter(std::slice::from_raw_parts(
                    input,
                    filelen as usize,
                )));
            }
            _ => {
                let stdin = std::io::stdin();
                solve(&mut fastproconio::ProconIBufIter::new(stdin.lock()));
            }
        }
    }
}

fn main() {
    const USE_THREAD: bool = false;
    if USE_THREAD {
        // In order to avoid potential stack overflow, spawn a new thread.
        let stack_size = 134_217_728; // 128 MB
        let thd = std::thread::Builder::new().stack_size(stack_size);
        thd.spawn(|| ilaunch()).unwrap().join().unwrap();
    } else {
        ilaunch()
    }
}

Submission Info

Submission Time
Task D - Writing a Numeral
User mizarjp
Language Rust (1.42.0)
Score 400
Code Size 104188 Byte
Status AC
Exec Time 24 ms
Memory 8192 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 3
AC × 20
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_rnd_00.txt, 01_rnd_01.txt, 01_rnd_02.txt, 01_rnd_03.txt, 01_rnd_04.txt, 02_add_00.txt, 02_add_01.txt, 02_add_02.txt, 02_add_03.txt, 03_del_00.txt, 03_del_01.txt, 03_del_02.txt, 03_del_03.txt, 03_del_04.txt, 03_del_05.txt, 04_one_00.txt, 04_one_01.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 6 ms 2204 KiB
00_sample_01.txt AC 1 ms 2112 KiB
00_sample_02.txt AC 2 ms 2156 KiB
01_rnd_00.txt AC 20 ms 5764 KiB
01_rnd_01.txt AC 24 ms 5856 KiB
01_rnd_02.txt AC 19 ms 5736 KiB
01_rnd_03.txt AC 19 ms 5820 KiB
01_rnd_04.txt AC 20 ms 5808 KiB
02_add_00.txt AC 20 ms 8192 KiB
02_add_01.txt AC 19 ms 8180 KiB
02_add_02.txt AC 18 ms 6968 KiB
02_add_03.txt AC 17 ms 6864 KiB
03_del_00.txt AC 19 ms 6336 KiB
03_del_01.txt AC 18 ms 6364 KiB
03_del_02.txt AC 19 ms 4796 KiB
03_del_03.txt AC 16 ms 4692 KiB
03_del_04.txt AC 15 ms 4708 KiB
03_del_05.txt AC 15 ms 4600 KiB
04_one_00.txt AC 4 ms 2192 KiB
04_one_01.txt AC 16 ms 4372 KiB