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
28pub struct FastInput {
37 ptr: *const u8,
38 end: *const u8,
39}
40
41impl FastInput {
42 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 let region = mmap(ptr::null_mut(), reserved, 1, 2 | 0x20, -1, 0);
62 if region as isize != -1 {
63 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 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 #[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 #[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 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 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 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 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
631pub 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 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
787static 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 let mut reader = unsafe { FastInput::from_slice(&input[offset..]) };
1219 for token in expected {
1220 assert_eq!(unsafe { reader.bytes() }, token);
1222 }
1223 }
1224 }
1225}