1#![allow(clippy::new_without_default)]
3
4use std::fmt::Display;
5use std::io::{Read, Write};
6
7pub struct FastIO {
9 in_bytes: Vec<u8>,
10 in_cur: usize,
11 out_buf: std::io::BufWriter<std::io::Stdout>,
12}
13
14impl FastIO {
15 pub fn new() -> Self {
17 let mut s = vec![];
18 std::io::stdin().read_to_end(&mut s).unwrap();
19
20 let cout = std::io::stdout();
21
22 Self {
23 in_bytes: s,
24 in_cur: 0,
25 out_buf: std::io::BufWriter::new(cout),
26 }
27 }
28
29 #[inline]
31 pub fn getc(&mut self) -> Option<u8> {
32 let c = *self.in_bytes.get(self.in_cur)?;
33 self.in_cur += 1;
34 Some(c)
35 }
36
37 #[inline]
39 pub fn peek(&self) -> Option<u8> {
40 Some(*self.in_bytes.get(self.in_cur)?)
41 }
42
43 #[inline]
45 pub fn skip(&mut self) {
46 while self.peek().is_some_and(|c| c.is_ascii_whitespace()) {
47 self.in_cur += 1;
48 }
49 }
50
51 pub fn read_u64(&mut self) -> u64 {
53 self.skip();
54 let mut ret: u64 = 0;
55
56 while self.peek().is_some_and(|c| c.is_ascii_digit()) {
57 ret = ret * 10 + (self.in_bytes[self.in_cur] - b'0') as u64;
58 self.in_cur += 1;
59 }
60
61 ret
62 }
63
64 pub fn read_u32(&mut self) -> u32 {
66 self.read_u64() as u32
67 }
68
69 pub fn read_usize(&mut self) -> usize {
71 self.read_u64() as usize
72 }
73
74 pub fn read_i64(&mut self) -> i64 {
76 self.skip();
77 let mut ret: i64 = 0;
78
79 let minus = if self.peek() == Some(b'-') {
80 self.in_cur += 1;
81 true
82 } else {
83 false
84 };
85
86 while self.peek().is_some_and(|c| c.is_ascii_digit()) {
87 ret = ret * 10 + (self.in_bytes[self.in_cur] - b'0') as i64;
88 self.in_cur += 1;
89 }
90
91 if minus {
92 ret = -ret;
93 }
94
95 ret
96 }
97
98 pub fn read_i32(&mut self) -> i32 {
100 self.read_i64() as i32
101 }
102
103 pub fn read_isize(&mut self) -> isize {
105 self.read_i64() as isize
106 }
107
108 pub fn read_f64(&mut self) -> f64 {
110 self.read_chars()
111 .into_iter()
112 .collect::<String>()
113 .parse()
114 .unwrap()
115 }
116
117 pub fn read_chars(&mut self) -> Vec<char> {
119 self.read_bytes().into_iter().map(Into::into).collect()
120 }
121
122 pub fn read_string(&mut self) -> String {
124 self.read_chars().into_iter().collect()
125 }
126
127 pub fn read_bytes(&mut self) -> Vec<u8> {
129 self.skip();
130 let mut ret = vec![];
131
132 while self.peek().is_some_and(|c| c.is_ascii_graphic()) {
133 ret.push(self.in_bytes[self.in_cur]);
134 self.in_cur += 1;
135 }
136
137 ret
138 }
139
140 pub fn read_char(&mut self) -> char {
142 self.skip();
143 self.getc().unwrap().into()
144 }
145
146 pub fn write<T: Display>(&mut self, s: T) {
148 self.out_buf.write_all(s.to_string().as_bytes()).unwrap();
149 }
150
151 pub fn write_rev<T: Display>(&mut self, s: T) {
153 let mut s = s.to_string().as_bytes().to_vec();
154 s.reverse();
155 self.out_buf.write_all(&s).unwrap();
156 }
157
158 pub fn writeln<T: Display>(&mut self, s: T) {
160 self.write(s);
161 self.out_buf.write_all(b"\n").unwrap();
162 }
163
164 pub fn writeln_rev<T: Display>(&mut self, s: T) {
166 self.write_rev(s);
167 self.out_buf.write_all(b"\n").unwrap();
168 }
169}
170
171impl Drop for FastIO {
172 fn drop(&mut self) {
173 self.out_buf.flush().unwrap();
174 }
175}