Skip to main content

competitive/tools/
fastio.rs

1use super::ScanSource;
2use std::{
3    fmt,
4    fs::File,
5    io::{Read, StdoutLock, Write, stdout},
6    os::fd::AsFd,
7    ptr,
8    str::FromStr,
9};
10
11#[cfg(target_os = "linux")]
12use std::ffi::{c_int, c_void};
13
14#[cfg(target_os = "linux")]
15unsafe extern "C" {
16    fn mmap(
17        addr: *mut c_void,
18        len: usize,
19        prot: c_int,
20        flags: c_int,
21        fd: c_int,
22        offset: isize,
23    ) -> *mut c_void;
24    fn munmap(addr: *mut c_void, len: usize) -> c_int;
25    fn getpagesize() -> c_int;
26}
27
28/// Token reader for little-endian targets. Integer reads require a decimal
29/// representation that fits the requested type, with at most that type's maximum
30/// number of digits and an optional `-` for signed types.
31///
32/// Every read, including iterator reads, must start at an available token.
33/// Reads consume exactly one trailing ASCII whitespace byte. `parse` and
34/// `ScanSource` require UTF-8. Slices returned by `bytes` must not outlive the input
35/// allocation. `bytes` and `parse` may also read an empty field at a delimiter.
36pub struct FastInput {
37    ptr: *const u8,
38    end: *const u8,
39}
40
41impl FastInput {
42    /// Reads all of stdin and retains its storage until process exit.
43    ///
44    /// # Safety
45    /// Call before any other stdin reads. A mapped input file must not be modified
46    /// while its contents or slices returned by this reader are in use.
47    /// Subsequent `ScanSource` reads must satisfy this type's token requirements.
48    pub unsafe fn stdin() -> Self {
49        let mut stdin = File::from(std::io::stdin().as_fd().try_clone_to_owned().unwrap());
50        #[cfg(target_os = "linux")]
51        unsafe {
52            if let Ok(metadata) = stdin.metadata()
53                && metadata.is_file()
54                && metadata.len() != 0
55            {
56                let len = metadata.len() as usize;
57                let page = getpagesize() as usize;
58                let mapped = len.div_ceil(page) * page;
59                let reserved = mapped + page;
60                // MAP_PRIVATE | MAP_ANONYMOUS reserves an initialized page after EOF.
61                let region = mmap(ptr::null_mut(), reserved, 1, 2 | 0x20, -1, 0);
62                if region as isize != -1 {
63                    // MAP_FIXED replaces only the file portion of our own reservation.
64                    if mmap(region, len, 1, 2 | 0x10, 0, 0) as isize != -1 {
65                        return FastInput {
66                            ptr: region.cast(),
67                            end: region.cast::<u8>().add(len),
68                        };
69                    }
70                    assert_eq!(munmap(region, reserved), 0);
71                }
72            }
73        }
74        let mut buf = Vec::new();
75        stdin.read_to_end(&mut buf).unwrap();
76        let len = buf.len();
77        buf.resize(len + 16, b' ');
78        let ptr = Box::into_raw(buf.into_boxed_slice()).cast::<u8>();
79        FastInput {
80            ptr,
81            end: unsafe { ptr.add(len) },
82        }
83    }
84
85    /// # Safety
86    /// `s` must contain at least 16 initialized padding bytes after its final
87    /// token delimiter. Its allocation must remain valid and unchanged while
88    /// this reader or any slices returned by it are in use.
89    /// Subsequent `ScanSource` reads must satisfy this type's token requirements.
90    pub unsafe fn from_slice(s: &[u8]) -> Self {
91        FastInput {
92            ptr: s.as_ptr(),
93            end: unsafe { s.as_ptr().add(s.len() - 16) },
94        }
95    }
96
97    /// Skips ASCII whitespace without advancing beyond the input.
98    #[inline]
99    pub fn skip_whitespace(&mut self) {
100        unsafe {
101            while self.ptr < self.end && (*self.ptr).is_ascii_whitespace() {
102                self.ptr = self.ptr.add(1);
103            }
104        }
105    }
106
107    #[inline]
108    unsafe fn fetch_ud4(&mut self) -> u16 {
109        unsafe {
110            let mut x: u32 = ptr::read_unaligned(self.ptr as *const u32);
111            x ^= 0x30303030;
112            let tmp = (x & 0xf0f0f0f0).trailing_zeros() >> 3;
113            x <<= 32 - (tmp << 3);
114            x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff;
115            x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff;
116            self.ptr = self.ptr.add((tmp + 1) as usize);
117            x as u16
118        }
119    }
120
121    #[inline]
122    unsafe fn fetch_ud8(&mut self) -> u32 {
123        unsafe {
124            let mut x: u64 = ptr::read_unaligned(self.ptr as *const u64);
125            x ^= 0x3030303030303030;
126            let tmp = (x & 0xf0f0f0f0f0f0f0f0).trailing_zeros() >> 3;
127            x <<= 64 - (tmp << 3);
128            x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff00ff00ff;
129            x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff0000ffff;
130            x = x.wrapping_mul(10000).wrapping_add(x >> 32) & 0x00000000ffffffff;
131            self.ptr = self.ptr.add((tmp + 1) as usize);
132            x as u32
133        }
134    }
135
136    #[inline]
137    pub unsafe fn u8(&mut self) -> u8 {
138        unsafe { self.fetch_ud4() as u8 }
139    }
140
141    #[inline]
142    pub unsafe fn u16(&mut self) -> u16 {
143        unsafe { self.fetch_ud8() as u16 }
144    }
145
146    /// 0..=99_999_999
147    #[inline]
148    pub unsafe fn u32_small(&mut self) -> u32 {
149        unsafe { self.fetch_ud8() }
150    }
151
152    #[inline]
153    pub unsafe fn u32(&mut self) -> u32 {
154        unsafe {
155            let mut x = u64::from_le(ptr::read_unaligned(self.ptr.cast())) ^ 0x3030303030303030;
156            let mask = x & 0xf0f0f0f0f0f0f0f0;
157            if mask != 0 {
158                let len = mask.trailing_zeros() >> 3;
159                x <<= 64 - len * 8;
160                self.ptr = self.ptr.add(len as usize + 1);
161                x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff00ff00ff;
162                x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff0000ffff;
163                x = x.wrapping_mul(10000).wrapping_add(x >> 32) & 0xffffffff;
164                x as u32
165            } else {
166                x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff00ff00ff;
167                x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff0000ffff;
168                x = x.wrapping_mul(10000).wrapping_add(x >> 32) & 0xffffffff;
169                let y = u16::from_le(ptr::read_unaligned(self.ptr.add(8).cast())) ^ 0x3030;
170                if y & 0xf0f0 == 0 {
171                    self.ptr = self.ptr.add(11);
172                    x as u32 * 100 + ((y.wrapping_mul(10).wrapping_add(y >> 8)) & 0xff) as u32
173                } else if y & 0xf0 == 0 {
174                    self.ptr = self.ptr.add(10);
175                    x as u32 * 10 + (y & 0xff) as u32
176                } else {
177                    self.ptr = self.ptr.add(9);
178                    x as u32
179                }
180            }
181        }
182    }
183
184    #[cfg(all(target_arch = "x86_64", target_feature = "ssse3"))]
185    #[inline]
186    pub unsafe fn u64(&mut self) -> u64 {
187        unsafe { self.u64_simd::<20>() }
188    }
189
190    #[cfg(all(target_arch = "x86_64", target_feature = "ssse3"))]
191    const SHUFFLE: [[u8; 16]; 16] = const {
192        let mut table = [[128; 16]; 16];
193        let mut n = 1;
194        while n < 16 {
195            let mut i = 16 - n;
196            while i < 16 {
197                table[n][i] = (i + n - 16) as u8;
198                i += 1;
199            }
200            n += 1;
201        }
202        table
203    };
204
205    #[cfg(all(target_arch = "x86_64", target_feature = "ssse3"))]
206    #[inline]
207    unsafe fn parse_ud16(digits: std::arch::x86_64::__m128i) -> u64 {
208        use std::arch::x86_64::*;
209        unsafe {
210            let pairs = _mm_maddubs_epi16(digits, _mm_set1_epi16(0x010a));
211            let quads = _mm_madd_epi16(pairs, _mm_set1_epi32(0x00010064));
212            let octets = _mm_add_epi64(
213                _mm_mul_epu32(quads, _mm_set1_epi64x(10000)),
214                _mm_srli_epi64::<32>(quads),
215            );
216            (_mm_cvtsi128_si64(octets) as u64) * 100000000
217                + (_mm_cvtsi128_si64(_mm_srli_si128::<8>(octets)) as u64)
218        }
219    }
220
221    #[cfg(all(target_arch = "x86_64", target_feature = "ssse3"))]
222    #[inline]
223    unsafe fn u64_simd<const MAX_DIGITS: usize>(&mut self) -> u64 {
224        use std::arch::x86_64::*;
225        unsafe {
226            let mut digits =
227                _mm_sub_epi8(_mm_loadu_si128(self.ptr.cast()), _mm_set1_epi8(b'0' as i8));
228            let mask = _mm_movemask_epi8(digits) as u32;
229            if mask != 0 {
230                let len = mask.trailing_zeros();
231                digits = _mm_shuffle_epi8(
232                    digits,
233                    _mm_loadu_si128(Self::SHUFFLE[len as usize].as_ptr().cast()),
234                );
235                self.ptr = self.ptr.add(len as usize + 1);
236                return Self::parse_ud16(digits);
237            }
238            self.ptr = self.ptr.add(16);
239            let mut res = Self::parse_ud16(digits);
240            let mut rem = ptr::read_unaligned(self.ptr.cast::<u32>()) ^ 0x30303030;
241            if (rem & 0xf0f0f0) == 0 {
242                if MAX_DIGITS == 19 {
243                    res = res.wrapping_mul(1000).wrapping_add(
244                        ((rem & 0xff) as u64)
245                            .wrapping_mul(100)
246                            .wrapping_add((((rem.wrapping_mul(2561)) & 0xff0000) >> 16) as u64),
247                    );
248                    self.ptr = self.ptr.add(4);
249                } else {
250                    let four = (rem & 0xf0f0f0f0) == 0;
251                    rem = rem.wrapping_shl((!four as u32) << 3);
252                    rem = rem.wrapping_mul(10).wrapping_add(rem >> 8) & 0x00ff00ff;
253                    rem = rem.wrapping_mul(100).wrapping_add(rem >> 16) & 0x0000ffff;
254                    res = res
255                        .wrapping_mul(1000 + 9000 * four as u64)
256                        .wrapping_add(rem as u64);
257                    self.ptr = self.ptr.add(4 + four as usize);
258                }
259            } else if (rem & 0xf0f0) == 0 {
260                res = res
261                    .wrapping_mul(100)
262                    .wrapping_add((((rem >> 8).wrapping_add(rem.wrapping_mul(10))) & 0xff) as u64);
263                self.ptr = self.ptr.add(3);
264            } else if (rem & 0xf0) == 0 {
265                res = res.wrapping_mul(10).wrapping_add((rem & 0x0000000f) as u64);
266                self.ptr = self.ptr.add(2);
267            } else {
268                self.ptr = self.ptr.add(1);
269            }
270            res
271        }
272    }
273
274    #[cfg(not(all(target_arch = "x86_64", target_feature = "ssse3")))]
275    #[inline]
276    pub unsafe fn u64(&mut self) -> u64 {
277        unsafe {
278            let mut res;
279            let mut x = ptr::read_unaligned(self.ptr as *const u64);
280            x ^= 0x3030303030303030;
281            if (x & 0xf0f0f0f0f0f0f0f0) == 0 {
282                self.ptr = self.ptr.add(8);
283                let mut y = ptr::read_unaligned(self.ptr as *const u64);
284                x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff00ff00ff;
285                x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff0000ffff;
286                x = x.wrapping_mul(10000).wrapping_add(x >> 32) & 0x00000000ffffffff;
287                res = x;
288                y ^= 0x3030303030303030;
289                if (y & 0xf0f0f0f0f0f0f0f0) == 0 {
290                    self.ptr = self.ptr.add(8);
291                    y = y.wrapping_mul(10).wrapping_add(y >> 8) & 0x00ff00ff00ff00ff;
292                    y = y.wrapping_mul(100).wrapping_add(y >> 16) & 0x0000ffff0000ffff;
293                    y = y.wrapping_mul(10000).wrapping_add(y >> 32) & 0x00000000ffffffff;
294                    res = res.wrapping_mul(100000000).wrapping_add(y);
295                    let mut rem = ptr::read_unaligned(self.ptr as *const u32);
296                    rem ^= 0x30303030;
297                    if (rem & 0xf0f0f0f0) == 0 {
298                        rem = rem.wrapping_mul(10).wrapping_add(rem >> 8) & 0x00ff00ff;
299                        rem = rem.wrapping_mul(100).wrapping_add(rem >> 16) & 0x0000ffff;
300                        res = res.wrapping_mul(10000).wrapping_add(rem as u64);
301                        self.ptr = self.ptr.add(5);
302                    } else if (rem & 0xf0f0f0) == 0 {
303                        res = res.wrapping_mul(1000).wrapping_add(
304                            ((rem & 0xff) as u64)
305                                .wrapping_mul(100)
306                                .wrapping_add((((rem.wrapping_mul(2561)) & 0xff0000) >> 16) as u64),
307                        );
308                        self.ptr = self.ptr.add(4);
309                    } else if (rem & 0xf0f0) == 0 {
310                        res = res.wrapping_mul(100).wrapping_add(
311                            (((rem >> 8).wrapping_add(rem.wrapping_mul(10))) & 0xff) as u64,
312                        );
313                        self.ptr = self.ptr.add(3);
314                    } else if (rem & 0xf0) == 0 {
315                        res = res.wrapping_mul(10).wrapping_add((rem & 0x0000000f) as u64);
316                        self.ptr = self.ptr.add(2);
317                    } else {
318                        self.ptr = self.ptr.add(1);
319                    }
320                } else {
321                    let mut x = (y & 0xffffffff) as u32;
322                    if (x & 0xf0f0f0f0) == 0 {
323                        y >>= 32;
324                        x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff;
325                        x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff;
326                        res = res.wrapping_mul(10000).wrapping_add(x as u64);
327                        self.ptr = self.ptr.add(4);
328                    }
329                    let mut x = (y & 0xffff) as u16;
330                    if (x & 0xf0f0) == 0 {
331                        y >>= 16;
332                        x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff;
333                        res = res.wrapping_mul(100).wrapping_add(x as u64);
334                        self.ptr = self.ptr.add(2);
335                    }
336                    let x = (y & 0xf0) == 0;
337                    if x {
338                        res = res.wrapping_mul(10).wrapping_add(y & 0xff);
339                    }
340                    self.ptr = self.ptr.add(x as usize + 1);
341                }
342            } else {
343                let tmp = (x & 0xf0f0f0f0f0f0f0f0).trailing_zeros() >> 3;
344                x = x.wrapping_shl(64 - (tmp << 3));
345                x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff00ff00ff;
346                x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff0000ffff;
347                x = x.wrapping_mul(10000).wrapping_add(x >> 32) & 0x00000000ffffffff;
348                res = x;
349                self.ptr = self.ptr.add((tmp + 1) as usize);
350            }
351            res
352        }
353    }
354
355    #[cfg(all(target_arch = "x86_64", target_feature = "ssse3"))]
356    #[inline]
357    pub unsafe fn u128(&mut self) -> u128 {
358        use std::arch::x86_64::*;
359        const POW10: [u64; 16] = const {
360            let mut powers = [1; 16];
361            let mut i = 1;
362            while i < 16 {
363                powers[i] = powers[i - 1] * 10;
364                i += 1;
365            }
366            powers
367        };
368        unsafe {
369            let first = _mm_sub_epi8(_mm_loadu_si128(self.ptr.cast()), _mm_set1_epi8(b'0' as i8));
370            let mask = _mm_movemask_epi8(first) as u32;
371            if mask != 0 {
372                let len = mask.trailing_zeros() as usize;
373                self.ptr = self.ptr.add(len + 1);
374                return Self::parse_ud16(_mm_shuffle_epi8(
375                    first,
376                    _mm_loadu_si128(Self::SHUFFLE[len].as_ptr().cast()),
377                )) as u128;
378            }
379            let second = _mm_sub_epi8(
380                _mm_loadu_si128(self.ptr.add(16).cast()),
381                _mm_set1_epi8(b'0' as i8),
382            );
383            let mask = _mm_movemask_epi8(second) as u32;
384            if mask != 0 {
385                let len = mask.trailing_zeros() as usize;
386                self.ptr = self.ptr.add(17 + len);
387                return Self::parse_ud16(first) as u128 * POW10[len] as u128
388                    + Self::parse_ud16(_mm_shuffle_epi8(
389                        second,
390                        _mm_loadu_si128(Self::SHUFFLE[len].as_ptr().cast()),
391                    )) as u128;
392            }
393            let mut tail = ptr::read_unaligned(self.ptr.add(32).cast::<u64>()) ^ 0x3030303030303030;
394            let len = (tail & 0xf0f0f0f0f0f0f0f0).trailing_zeros() as usize / 8;
395            tail = if len == 0 { 0 } else { tail << ((8 - len) * 8) };
396            tail = tail.wrapping_mul(10).wrapping_add(tail >> 8) & 0x00ff00ff00ff00ff;
397            tail = tail.wrapping_mul(100).wrapping_add(tail >> 16) & 0x0000ffff0000ffff;
398            tail = tail.wrapping_mul(10000).wrapping_add(tail >> 32) & 0xffffffff;
399            self.ptr = self.ptr.add(33 + len);
400            (Self::parse_ud16(first) as u128 * 10_000_000_000_000_000
401                + Self::parse_ud16(second) as u128)
402                * POW10[len] as u128
403                + tail as u128
404        }
405    }
406
407    #[cfg(not(all(target_arch = "x86_64", target_feature = "ssse3")))]
408    #[inline]
409    pub unsafe fn u128(&mut self) -> u128 {
410        unsafe {
411            let mut res = 0u128;
412            for i in 0..4 {
413                let mut x = ptr::read_unaligned(self.ptr as *const u64);
414                x ^= 0x3030303030303030;
415                if (x & 0xf0f0f0f0f0f0f0f0) != 0 {
416                    break;
417                }
418                x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff00ff00ff;
419                x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff0000ffff;
420                x = x.wrapping_mul(10000).wrapping_add(x >> 32) & 0x00000000ffffffff;
421                if i == 0 {
422                    res = x as u128;
423                } else {
424                    res = res.wrapping_mul(100000000).wrapping_add(x as u128);
425                }
426                self.ptr = self.ptr.add(8);
427            }
428            let mut res2 = 0u64;
429            let mut pow = 1u64;
430            let mut x = ptr::read_unaligned(self.ptr as *const u64);
431            x ^= 0x3030303030303030;
432            let mut rem = x;
433            if (x & 0xf0f0f0f0) == 0 {
434                rem >>= 32;
435                x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff00ff;
436                x = x.wrapping_mul(100).wrapping_add(x >> 16) & 0x0000ffff;
437                res2 = x;
438                pow = 10000;
439                self.ptr = self.ptr.add(4);
440            }
441            {
442                let mut x = (rem & 0xffff) as u16;
443                if (x & 0xf0f0) == 0 {
444                    rem >>= 16;
445                    x = x.wrapping_mul(10).wrapping_add(x >> 8) & 0x00ff;
446                    res2 = res2.wrapping_mul(100).wrapping_add(x as u64);
447                    pow = pow.wrapping_mul(100);
448                    self.ptr = self.ptr.add(2);
449                }
450            }
451            {
452                let x = (rem & 0xf0) == 0;
453                if x {
454                    res2 = res2.wrapping_mul(10).wrapping_add(rem & 0xff);
455                    pow = pow.wrapping_mul(10);
456                }
457                self.ptr = self.ptr.add(x as usize + 1);
458            }
459            res = res.wrapping_mul(pow as u128).wrapping_add(res2 as u128);
460            res
461        }
462    }
463
464    #[inline]
465    pub unsafe fn usize(&mut self) -> usize {
466        unsafe { self.u64() as usize }
467    }
468
469    #[inline]
470    pub unsafe fn i8(&mut self) -> i8 {
471        unsafe {
472            let b = *self.ptr == b'-';
473            self.ptr = self.ptr.add(b as usize);
474            let mut x = self.u8() as i8;
475            if b {
476                x = x.wrapping_neg();
477            }
478            x
479        }
480    }
481
482    #[inline]
483    pub unsafe fn i16(&mut self) -> i16 {
484        unsafe {
485            let b = *self.ptr == b'-';
486            self.ptr = self.ptr.add(b as usize);
487            let mut x = self.u16() as i16;
488            if b {
489                x = x.wrapping_neg();
490            }
491            x
492        }
493    }
494
495    #[inline]
496    pub unsafe fn i32(&mut self) -> i32 {
497        unsafe {
498            let b = *self.ptr == b'-';
499            self.ptr = self.ptr.add(b as usize);
500            let mut x = self.u32() as i32;
501            if b {
502                x = x.wrapping_neg();
503            }
504            x
505        }
506    }
507
508    #[inline]
509    pub unsafe fn i64(&mut self) -> i64 {
510        unsafe {
511            let b = *self.ptr == b'-';
512            self.ptr = self.ptr.add(b as usize);
513            #[cfg(all(target_arch = "x86_64", target_feature = "ssse3"))]
514            let mut x = self.u64_simd::<19>() as i64;
515            #[cfg(not(all(target_arch = "x86_64", target_feature = "ssse3")))]
516            let mut x = self.u64() as i64;
517            if b {
518                x = x.wrapping_neg();
519            }
520            x
521        }
522    }
523
524    #[inline]
525    pub unsafe fn i128(&mut self) -> i128 {
526        unsafe {
527            let b = *self.ptr == b'-';
528            self.ptr = self.ptr.add(b as usize);
529            let mut x = self.u128() as i128;
530            if b {
531                x = x.wrapping_neg();
532            }
533            x
534        }
535    }
536
537    #[inline]
538    pub unsafe fn isize(&mut self) -> isize {
539        unsafe { self.i64() as isize }
540    }
541
542    #[inline]
543    pub unsafe fn byte(&mut self) -> u8 {
544        unsafe {
545            let c = *self.ptr;
546            self.ptr = self.ptr.add(2);
547            c
548        }
549    }
550
551    #[inline]
552    pub unsafe fn bytes<'a>(&mut self) -> &'a [u8] {
553        unsafe {
554            let start = self.ptr;
555            'token: {
556                #[cfg(all(
557                    target_arch = "x86_64",
558                    any(target_feature = "avx2", target_feature = "avx512bw")
559                ))]
560                {
561                    // Short fields avoid the SIMD mask-to-pointer dependency between reads.
562                    let x = self.ptr.cast::<u64>().read_unaligned();
563                    if x.wrapping_sub(0x2121_2121_2121_2121) & !x & 0x8080_8080_8080_8080 != 0 {
564                        break 'token;
565                    }
566                }
567                #[cfg(all(target_arch = "x86_64", target_feature = "avx512bw"))]
568                {
569                    use std::arch::x86_64::*;
570                    let space = _mm512_set1_epi8(32);
571                    // The 16-byte padding contract does not permit a full SIMD load at EOF.
572                    while self.end.offset_from(self.ptr) >= 64 {
573                        let bytes = _mm512_loadu_si512(self.ptr.cast());
574                        let low = _mm512_cmple_epu8_mask(bytes, space);
575                        if low != 0 {
576                            self.ptr = self.ptr.add(low.trailing_zeros() as usize);
577                            break 'token;
578                        }
579                        self.ptr = self.ptr.add(64);
580                    }
581                }
582                #[cfg(all(
583                    target_arch = "x86_64",
584                    target_feature = "avx2",
585                    not(target_feature = "avx512bw")
586                ))]
587                {
588                    use std::arch::x86_64::*;
589                    let space = _mm256_set1_epi8(32);
590                    // The public contract guarantees only 16 padding bytes, so full SIMD
591                    // loads stay within the input; the scalar loop handles its final token.
592                    while self.end.offset_from(self.ptr) >= 32 {
593                        let bytes = _mm256_loadu_si256(self.ptr.cast());
594                        let low = _mm256_cmpeq_epi8(_mm256_min_epu8(bytes, space), bytes);
595                        if _mm256_movemask_epi8(low) != 0 {
596                            break;
597                        }
598                        self.ptr = self.ptr.add(32);
599                    }
600                }
601                loop {
602                    // Padding permits this load; bytes above ASCII space cannot be separators.
603                    let x = self.ptr.cast::<u64>().read_unaligned();
604                    if x.wrapping_sub(0x2121_2121_2121_2121) & !x & 0x8080_8080_8080_8080 != 0 {
605                        break 'token;
606                    }
607                    self.ptr = self.ptr.add(8);
608                }
609            }
610            while !(*self.ptr).is_ascii_whitespace() {
611                self.ptr = self.ptr.add(1);
612            }
613            let len = self.ptr.offset_from(start) as usize;
614            self.ptr = self.ptr.add(1);
615            std::slice::from_raw_parts(start, len)
616        }
617    }
618
619    #[inline]
620    pub unsafe fn parse<T>(&mut self) -> T
621    where
622        T: FromStr,
623    {
624        unsafe {
625            let s = std::str::from_utf8_unchecked(self.bytes());
626            s.parse().ok().unwrap()
627        }
628    }
629}
630
631/// Buffered token reader with the same token requirements as [`FastInput`].
632/// Tokens may span reads and borrowed tokens remain valid until the next scan.
633pub struct BufferedInput<R> {
634    reader: R,
635    buffer: Vec<u8>,
636    input: FastInput,
637    filled: usize,
638    eof: bool,
639}
640
641impl<R: Read> BufferedInput<R> {
642    /// # Safety
643    /// Every scan must satisfy [`FastInput`]'s token requirements, including UTF-8.
644    pub unsafe fn new(reader: R) -> Self {
645        let buffer = vec![b' '; (1 << 16) + 16];
646        let input = FastInput {
647            ptr: buffer.as_ptr(),
648            end: buffer.as_ptr(),
649        };
650        Self {
651            reader,
652            buffer,
653            input,
654            filled: 0,
655            eof: false,
656        }
657    }
658
659    #[cold]
660    fn refill(&mut self) -> bool {
661        if self.eof {
662            return false;
663        }
664        let position = unsafe { self.input.ptr.offset_from(self.buffer.as_ptr()) as usize };
665        self.buffer.copy_within(position..self.filled, 0);
666        self.filled -= position;
667        self.input = FastInput {
668            ptr: self.buffer.as_ptr(),
669            end: self.buffer.as_ptr(),
670        };
671        loop {
672            if self.filled == self.buffer.len() - 16 {
673                self.buffer.resize(2 * self.filled + 16, b' ');
674                self.input = FastInput {
675                    ptr: self.buffer.as_ptr(),
676                    end: self.buffer.as_ptr(),
677                };
678            }
679            let end = self.buffer.len() - 16;
680            let start = self.filled;
681            match self.reader.read(&mut self.buffer[self.filled..end]) {
682                Ok(0) => {
683                    self.eof = true;
684                    if self.filled != 0 {
685                        self.buffer[self.filled] = b' ';
686                        self.filled += 1;
687                    }
688                }
689                Ok(n) => self.filled += n,
690                Err(e) if e.kind() == std::io::ErrorKind::Interrupted => continue,
691                Err(e) => panic!("io error: {e}"),
692            }
693            let (prefix, chunks) = self.buffer[start..self.filled].as_rchunks();
694            let end = prefix.len()
695                + 8 * chunks
696                    .iter()
697                    .rposition(|&chunk| {
698                        let x = u64::from_le_bytes(chunk);
699                        x.wrapping_sub(0x2121_2121_2121_2121) & !x & 0x8080_8080_8080_8080 != 0
700                    })
701                    .map_or(0, |i| i + 1);
702            if let Some(end) = self.buffer[start..start + end]
703                .iter()
704                .rposition(u8::is_ascii_whitespace)
705            {
706                self.buffer[self.filled..self.filled + 16].fill(b' ');
707                self.input = FastInput {
708                    ptr: self.buffer.as_ptr(),
709                    end: unsafe { self.buffer.as_ptr().add(start + end + 1) },
710                };
711                return true;
712            }
713            if self.eof {
714                self.input = FastInput {
715                    ptr: self.buffer.as_ptr(),
716                    end: self.buffer.as_ptr(),
717                };
718                return false;
719            }
720        }
721    }
722}
723
724macro_rules! impl_buffered_scan_integer {
725    ($($ty:ty, $read:ident, $method:ident);* $(;)?) => {$(
726        #[inline]
727        fn $read(&mut self) -> Option<$ty> {
728            if self.input.ptr >= self.input.end && !self.refill() {
729                return None;
730            }
731            Some(unsafe { self.input.$method() })
732        }
733    )*};
734}
735
736impl<R: Read> ScanSource for BufferedInput<R> {
737    #[inline]
738    fn skip_whitespace(&mut self) {
739        loop {
740            self.input.skip_whitespace();
741            if self.input.ptr < self.input.end || !self.refill() {
742                break;
743            }
744        }
745    }
746
747    #[inline]
748    fn next_token(&mut self) -> Option<&str> {
749        if self.input.ptr >= self.input.end && !self.refill() {
750            return None;
751        }
752        Some(unsafe { std::str::from_utf8_unchecked(self.input.bytes()) })
753    }
754
755    impl_buffered_scan_integer!(
756        u8, read_u8, u8;
757        u16, read_u16, u16;
758        u32, read_u32, u32;
759        u64, read_u64, u64;
760        u128, read_u128, u128;
761        usize, read_usize, usize;
762        i8, read_i8, i8;
763        i16, read_i16, i16;
764        i32, read_i32, i32;
765        i64, read_i64, i64;
766        i128, read_i128, i128;
767        isize, read_isize, isize;
768    );
769}
770
771static DIGIT4: [[u8; 4]; 10000] = const {
772    let mut arr = [[b' '; 4]; 10000];
773    let mut i = 0;
774    while i < 10000 {
775        let mut x = i;
776        let mut j = 4;
777        while j > 0 {
778            j -= 1;
779            arr[i][j] = b'0' + (x % 10) as u8;
780            x /= 10;
781        }
782        i += 1;
783    }
784    arr
785};
786
787// The top two bits store the digit count minus one; the rest holds little-endian ASCII.
788static DIGIT4_TRIMMED: [u32; 10000] = const {
789    let mut arr = [0; 10000];
790    let mut i = 0;
791    while i < 10000 {
792        let off = (i < 10) as usize + (i < 100) as usize + (i < 1000) as usize;
793        arr[i] = (u32::from_le_bytes(DIGIT4[i]) >> (8 * off)) | (((3 - off) as u32) << 30);
794        i += 1;
795    }
796    arr
797};
798
799pub struct FastOutput<W>
800where
801    W: Write,
802{
803    buf: Box<[u8]>,
804    pos: usize,
805    inner: W,
806}
807
808impl FastOutput<StdoutLock<'static>> {
809    pub fn stdout() -> Self {
810        Self::new(stdout().lock())
811    }
812}
813
814impl<W> Drop for FastOutput<W>
815where
816    W: Write,
817{
818    fn drop(&mut self) {
819        let _ = self.inner.write_all(&self.buf[..self.pos]);
820    }
821}
822
823impl<W> FastOutput<W>
824where
825    W: Write,
826{
827    pub fn new(writer: W) -> Self {
828        Self::with_capacity(1 << 18, writer)
829    }
830
831    pub fn with_capacity(capacity: usize, writer: W) -> Self {
832        FastOutput {
833            buf: vec![0; capacity.max(32)].into_boxed_slice(),
834            pos: 0,
835            inner: writer,
836        }
837    }
838
839    pub fn flush(&mut self) {
840        self.flush_buf();
841        self.inner.flush().unwrap();
842    }
843
844    #[cold]
845    fn flush_buf(&mut self) {
846        if self.pos != 0 {
847            self.inner.write_all(&self.buf[..self.pos]).unwrap();
848            self.pos = 0;
849        }
850    }
851
852    #[inline]
853    fn ensure_capacity(&mut self, capacity: usize) {
854        if self.buf.len() - self.pos < capacity {
855            self.flush_buf();
856        }
857    }
858
859    #[inline]
860    unsafe fn write_byte_unchecked(&mut self, byte: u8) {
861        unsafe {
862            *self.buf.as_mut_ptr().add(self.pos) = byte;
863        }
864        self.pos += 1;
865    }
866
867    #[inline]
868    unsafe fn write_digit4_unchecked(&mut self, x: usize) {
869        debug_assert!(x < 10000);
870        unsafe {
871            ptr::write_unaligned(
872                self.buf.as_mut_ptr().add(self.pos) as *mut u32,
873                ptr::read_unaligned((DIGIT4.as_ptr() as *const u8).add(4 * x) as *const u32),
874            );
875        }
876        self.pos += 4;
877    }
878
879    #[inline]
880    unsafe fn write_digit4_trimmed_unchecked(&mut self, x: usize) {
881        unsafe {
882            let word = *DIGIT4_TRIMMED.get_unchecked(x);
883            ptr::write_unaligned(
884                self.buf.as_mut_ptr().add(self.pos).cast::<u32>(),
885                (word & 0x3fffffff).to_le(),
886            );
887            self.pos += (word >> 30) as usize + 1;
888        }
889    }
890
891    #[inline]
892    unsafe fn write_u8_unchecked(&mut self, x: u8) {
893        let off = (x < 10) as usize + (x < 100) as usize + 1;
894        unsafe {
895            ptr::write_unaligned(
896                self.buf.as_mut_ptr().add(self.pos) as *mut u32,
897                ptr::read_unaligned(
898                    (DIGIT4.as_ptr() as *const u8).add(4 * x as usize + off) as *const u32
899                ),
900            );
901        }
902        self.pos += 4 - off;
903    }
904
905    #[inline]
906    unsafe fn write_u16_unchecked(&mut self, x: u16) {
907        unsafe {
908            if x >= 10000 {
909                self.write_digit4_trimmed_unchecked((x / 10000) as usize);
910                self.write_digit4_unchecked((x % 10000) as usize);
911            } else {
912                self.write_digit4_trimmed_unchecked(x as usize);
913            }
914        }
915    }
916
917    #[inline]
918    unsafe fn write_u32_unchecked(&mut self, x: u32) {
919        unsafe {
920            if x >= 1_0000_0000 {
921                let b = x / 10000;
922                let a = x / 100000000;
923                self.write_u8_unchecked(a as u8);
924                self.write_digit4_unchecked((b - a * 10000) as usize);
925                self.write_digit4_unchecked((x % 10000) as usize);
926            } else if x >= 10000 {
927                self.write_digit4_trimmed_unchecked((x / 10000) as usize);
928                self.write_digit4_unchecked((x % 10000) as usize);
929            } else {
930                self.write_digit4_trimmed_unchecked(x as usize);
931            }
932        }
933    }
934
935    #[inline(always)]
936    unsafe fn write_u64_unchecked(&mut self, x: u64) {
937        unsafe {
938            if x < 10000 {
939                self.write_digit4_trimmed_unchecked(x as usize);
940                return;
941            }
942            if x >= 1_0000_0000_0000_0000 {
943                let d = x / 10000;
944                let c = x / 100000000;
945                let b = x / 1000000000000;
946                let a = x / 10000000000000000;
947                self.write_digit4_trimmed_unchecked(a as usize);
948                self.write_digit4_unchecked((b - a * 10000) as usize);
949                self.write_digit4_unchecked((c - b * 10000) as usize);
950                self.write_digit4_unchecked((d - c * 10000) as usize);
951                self.write_digit4_unchecked((x % 10000) as usize);
952            } else if x >= 1_0000_0000_0000 {
953                let c = x / 10000;
954                let b = x / 100000000;
955                let a = x / 1000000000000;
956                self.write_digit4_trimmed_unchecked(a as usize);
957                self.write_digit4_unchecked((b - a * 10000) as usize);
958                self.write_digit4_unchecked((c - b * 10000) as usize);
959                self.write_digit4_unchecked((x % 10000) as usize);
960            } else if x >= 1_0000_0000 {
961                let b = x / 10000;
962                let a = x / 100000000;
963                self.write_digit4_trimmed_unchecked(a as usize);
964                self.write_digit4_unchecked((b - a * 10000) as usize);
965                self.write_digit4_unchecked((x % 10000) as usize);
966            } else {
967                self.write_digit4_trimmed_unchecked((x / 10000) as usize);
968                self.write_digit4_unchecked((x % 10000) as usize);
969            }
970        }
971    }
972
973    #[inline]
974    pub fn u8(&mut self, x: u8) {
975        self.ensure_capacity(4);
976        unsafe { self.write_u8_unchecked(x) }
977    }
978
979    #[inline]
980    pub fn u16(&mut self, x: u16) {
981        self.ensure_capacity(5);
982        unsafe { self.write_u16_unchecked(x) }
983    }
984
985    #[inline]
986    pub fn u32(&mut self, x: u32) {
987        self.ensure_capacity(10);
988        unsafe { self.write_u32_unchecked(x) }
989    }
990
991    #[inline(always)]
992    pub fn u64(&mut self, x: u64) {
993        self.ensure_capacity(20);
994        unsafe { self.write_u64_unchecked(x) }
995    }
996
997    #[inline]
998    pub fn i8(&mut self, x: i8) {
999        if x < 0 {
1000            self.ensure_capacity(5);
1001            unsafe {
1002                self.write_byte_unchecked(b'-');
1003                self.write_u8_unchecked(x.wrapping_neg() as u8);
1004            }
1005        } else {
1006            self.u8(x as u8);
1007        }
1008    }
1009
1010    #[inline]
1011    pub fn i16(&mut self, x: i16) {
1012        if x < 0 {
1013            self.ensure_capacity(6);
1014            unsafe {
1015                self.write_byte_unchecked(b'-');
1016                self.write_u16_unchecked(x.wrapping_neg() as u16);
1017            }
1018        } else {
1019            self.u16(x as u16);
1020        }
1021    }
1022
1023    #[inline]
1024    pub fn i32(&mut self, x: i32) {
1025        if x < 0 {
1026            self.ensure_capacity(11);
1027            unsafe {
1028                self.write_byte_unchecked(b'-');
1029                self.write_u32_unchecked(x.wrapping_neg() as u32);
1030            }
1031        } else {
1032            self.u32(x as u32);
1033        }
1034    }
1035
1036    #[inline(always)]
1037    pub fn i64(&mut self, x: i64) {
1038        if x < 0 {
1039            self.ensure_capacity(21);
1040            unsafe {
1041                self.write_byte_unchecked(b'-');
1042                self.write_u64_unchecked(x.wrapping_neg() as u64);
1043            }
1044        } else {
1045            self.u64(x as u64);
1046        }
1047    }
1048
1049    #[inline(always)]
1050    pub fn usize(&mut self, x: usize) {
1051        if usize::BITS == 64 {
1052            self.u64(x as u64);
1053        } else {
1054            self.u32(x as u32);
1055        }
1056    }
1057
1058    #[inline(always)]
1059    pub fn isize(&mut self, x: isize) {
1060        if isize::BITS == 64 {
1061            self.i64(x as i64);
1062        } else {
1063            self.i32(x as i32);
1064        }
1065    }
1066
1067    pub fn u128(&mut self, mut x: u128) {
1068        const BASE: u128 = 10_000_000_000_000_000_000;
1069        let mut groups = [0u64; 2];
1070        let mut len = 0;
1071        while x > u64::MAX as u128 {
1072            groups[len] = (x % BASE) as u64;
1073            x /= BASE;
1074            len += 1;
1075        }
1076        self.u64(x as u64);
1077        for &x in groups[..len].iter().rev() {
1078            self.ensure_capacity(19);
1079            unsafe {
1080                ptr::copy_nonoverlapping(
1081                    DIGIT4[(x / 10_000_000_000_000_000) as usize]
1082                        .as_ptr()
1083                        .add(1),
1084                    self.buf.as_mut_ptr().add(self.pos),
1085                    3,
1086                );
1087                self.pos += 3;
1088                self.write_digit4_unchecked((x / 1_000_000_000_000 % 10000) as usize);
1089                self.write_digit4_unchecked((x / 100_000_000 % 10000) as usize);
1090                self.write_digit4_unchecked((x / 10000 % 10000) as usize);
1091                self.write_digit4_unchecked((x % 10000) as usize);
1092            }
1093        }
1094    }
1095
1096    pub fn i128(&mut self, x: i128) {
1097        if x < 0 {
1098            self.byte(b'-');
1099        }
1100        self.u128(x.unsigned_abs());
1101    }
1102
1103    #[inline]
1104    pub fn byte(&mut self, b: u8) {
1105        self.ensure_capacity(1);
1106        unsafe { self.write_byte_unchecked(b) }
1107    }
1108
1109    #[inline(always)]
1110    pub fn bytes(&mut self, s: &[u8]) {
1111        if s.len() > self.buf.len() {
1112            self.flush_buf();
1113            self.inner.write_all(s).unwrap();
1114        } else {
1115            self.ensure_capacity(s.len());
1116            unsafe {
1117                ptr::copy_nonoverlapping(s.as_ptr(), self.buf.as_mut_ptr().add(self.pos), s.len());
1118            }
1119            self.pos += s.len();
1120        }
1121    }
1122}
1123
1124impl<W: Write> fmt::Write for FastOutput<W> {
1125    fn write_str(&mut self, s: &str) -> fmt::Result {
1126        self.bytes(s.as_bytes());
1127        Ok(())
1128    }
1129}
1130
1131#[cfg(test)]
1132mod tests {
1133    use super::*;
1134    use crate::tools::Xorshift;
1135    use crate::tools::testutil::integer_boundary_values;
1136
1137    #[test]
1138    fn test_integer_io() {
1139        let mut rng = Xorshift::default();
1140        macro_rules! check {
1141            ($($ty:ident),*) => {$(
1142                for offset in 0..64 {
1143                    let mut values = integer_boundary_values!($ty);
1144                    if $ty::BITS <= 16 && offset == 0 {
1145                        values.extend($ty::MIN..=$ty::MAX);
1146                    }
1147                    let n = rng.random(0..=1000);
1148                    values.extend((0..n).map(|_| {
1149                        let x: $ty = rng.random(..);
1150                        x >> rng.random(0..$ty::BITS)
1151                    }));
1152                    let mut input = vec![b' '; offset];
1153                    for x in &values {
1154                        write!(input, "{}{}", x, char::from([b' ', b'\n', b'\t'][rng.random(0usize..3)])).unwrap();
1155                    }
1156                    input.extend_from_slice(&[b' '; 16]);
1157                    let input = input.into_boxed_slice();
1158                    let mut reader = unsafe { FastInput::from_slice(&input[offset..]) };
1159                    for &x in &values { assert_eq!(unsafe { reader.$ty() }, x); }
1160                    let mut output = Vec::new();
1161                    {
1162                        let mut writer = FastOutput::with_capacity(offset, &mut output);
1163                        for &x in &values { writer.$ty(x); writer.byte(b'\n'); }
1164                    }
1165                    let expected: String = values.iter().map(|x| format!("{x}\n")).collect();
1166                    assert_eq!(output, expected.as_bytes());
1167                }
1168            )*};
1169        }
1170        check!(
1171            u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize
1172        );
1173        for value in integer_boundary_values!(u32)
1174            .into_iter()
1175            .filter(|&v| v < 100_000_000)
1176            .chain(rng.random_iter(0..100_000_000u32).take(1000))
1177        {
1178            let input = format!("{value}                 ");
1179            let mut reader = unsafe { FastInput::from_slice(input.as_bytes()) };
1180            assert_eq!(unsafe { reader.u32_small() }, value);
1181        }
1182    }
1183
1184    #[test]
1185    fn test_input_bytes() {
1186        let mut rng = Xorshift::new_with_seed(612971);
1187        for _ in 0..512 {
1188            let offset = rng.random(0..64);
1189            let mut input: Vec<u8> = (0..offset).map(|_| rng.random(..)).collect();
1190            let mut expected = Vec::new();
1191            for _ in 0..rng.random(1..32) {
1192                let len = if rng.rand(4) == 0 {
1193                    rng.random(0..10000)
1194                } else {
1195                    rng.random(0..128)
1196                };
1197                let ascii = rng.rand(2) == 0;
1198                let token: Vec<u8> = (0..len)
1199                    .map(|_| {
1200                        loop {
1201                            let byte: u8 = if ascii {
1202                                rng.random(33..127)
1203                            } else {
1204                                rng.random(..)
1205                            };
1206                            if !byte.is_ascii_whitespace() {
1207                                break byte;
1208                            }
1209                        }
1210                    })
1211                    .collect();
1212                input.extend_from_slice(&token);
1213                input.push([b' ', b'\t', b'\n', b'\r', 12][rng.random(0usize..5)]);
1214                expected.push(token);
1215            }
1216            input.extend([b' '; 16]);
1217            // SAFETY: input remains alive and every field has a delimiter followed by padding.
1218            let mut reader = unsafe { FastInput::from_slice(&input[offset..]) };
1219            for token in expected {
1220                // SAFETY: byte fields need not be UTF-8; each read consumes one delimited field.
1221                assert_eq!(unsafe { reader.bytes() }, token);
1222            }
1223        }
1224    }
1225}