This documentation is automatically generated by online-judge-tools/verification-helper
#include "template/fastio.hpp"
#include <cstdio>
#include <cstring>
#include <type_traits>
#include <utility>
// unable to read INT_MIN (int), LLONG_MIN (long long)
class Reader {
FILE *fp;
static constexpr int BUF = 1 << 18;
char buf[BUF];
char *pl, *pr;
void reread() {
int wd = pr - pl;
std::memcpy(buf, pl, wd);
pl = buf;
pr = buf + wd;
pr += std::fread(pr, 1, BUF - wd, fp);
}
char skip() {
char ch = *pl++;
while (ch <= ' ') {
ch = *pl++;
}
return ch;
}
template <typename T>
void read_unsigned(T &x) {
if (pr - pl < 64) {
reread();
}
x = 0;
char ch = skip();
while ('0' <= ch) {
x = 10 * x + (0xf & ch);
ch = *pl++;
}
}
template <typename T>
void read_signed(T &x) {
if (pr - pl < 64) {
reread();
}
x = 0;
bool neg = false;
char ch = skip();
if (ch == '-') {
ch = *pl++;
neg = true;
}
while ('0' <= ch) {
x = 10 * x + (0xf & ch);
ch = *pl++;
}
if (neg) {
x = -x;
}
}
void read_single(int &x) { read_signed(x); }
void read_single(unsigned &x) { read_unsigned(x); }
void read_single(long &x) { read_signed(x); }
void read_single(unsigned long &x) { read_signed(x); }
void read_single(long long &x) { read_signed(x); }
void read_single(unsigned long long &x) { read_unsigned(x); }
public:
Reader(FILE *fp) : fp(fp), pl(buf), pr(buf) { reread(); }
void read() {}
template <typename Head, typename... Tail>
void read(Head &head, Tail &...tail) {
read_single(head);
read(tail...);
}
};
struct NumberToString {
char buf[10000][4];
constexpr NumberToString() : buf() {
for (int i = 0; i < 10000; ++i) {
int n = i;
for (int j = 3; j >= 0; --j) {
buf[i][j] = '0' + n % 10;
n /= 10;
}
}
}
} constexpr number_to_string_precalc;
class Writer {
FILE *fp;
static constexpr int BUF = 1 << 18;
char buf[BUF];
char *ptr;
void write_u32(unsigned x) {
if ((buf + BUF - ptr) < 32) {
flush();
}
static char sml[12];
int t = 8;
while (x >= 10000) {
unsigned n = x % 10000;
x /= 10000;
std::memcpy(sml + t, number_to_string_precalc.buf[n], 4);
t -= 4;
}
if (x >= 1000) {
std::memcpy(ptr, number_to_string_precalc.buf[x], 4);
ptr += 4;
} else if (x >= 100) {
std::memcpy(ptr, number_to_string_precalc.buf[x] + 1, 3);
ptr += 3;
} else if (x >= 10) {
unsigned q = (x * 103) >> 10;
*ptr++ = q | '0';
*ptr++ = (x - 10 * q) | '0';
} else {
*ptr++ = '0' | x;
}
std::memcpy(ptr, sml + (t + 4), 8 - t);
ptr += 8 - t;
}
void write_u64(unsigned long long x) {
if ((buf + BUF - ptr) < 32) {
flush();
}
if (x >= 10000000000000000) {
unsigned long long z = x % 100000000;
x /= 100000000;
unsigned long long y = x % 100000000;
x /= 100000000;
if (x >= 1000) {
std::memcpy(ptr, number_to_string_precalc.buf[x], 4);
ptr += 4;
} else if (x >= 100) {
std::memcpy(ptr, number_to_string_precalc.buf[x] + 1, 3);
ptr += 3;
} else if (x >= 10) {
unsigned q = (x * 103) >> 10;
*ptr++ = q | '0';
*ptr++ = (x - 10 * q) | '0';
} else {
*ptr++ = '0' | x;
}
std::memcpy(ptr, number_to_string_precalc.buf[y / 10000], 4);
std::memcpy(ptr + 4, number_to_string_precalc.buf[y % 10000], 4);
std::memcpy(ptr + 8, number_to_string_precalc.buf[z / 10000], 4);
std::memcpy(ptr + 12, number_to_string_precalc.buf[z % 10000], 4);
ptr += 16;
} else {
static char sml[12];
int t = 8;
while (x >= 10000) {
unsigned long long n = x % 10000;
x /= 10000;
std::memcpy(sml + t, number_to_string_precalc.buf[n], 4);
t -= 4;
}
if (x >= 1000) {
std::memcpy(ptr, number_to_string_precalc.buf[x], 4);
ptr += 4;
} else if (x >= 100) {
std::memcpy(ptr, number_to_string_precalc.buf[x] + 1, 3);
ptr += 3;
} else if (x >= 10) {
unsigned q = (x * 103) >> 10;
*ptr++ = q | '0';
*ptr++ = (x - 10 * q) | '0';
} else {
*ptr++ = '0' | x;
}
std::memcpy(ptr, sml + (t + 4), 8 - t);
ptr += 8 - t;
}
}
void write_char(char c) {
if (ptr == buf + BUF) {
flush();
}
*ptr++ = c;
}
template <typename T>
void write_unsigned(T x) {
if constexpr (std::is_same_v<T, unsigned long long> ||
std::is_same_v<T, unsigned long>) {
write_u64(x);
} else {
write_u32(x);
}
}
template <typename T>
void write_signed(T x) {
std::make_unsigned_t<T> y = x;
if (x < 0) {
write_char('-');
y = -y;
}
write_unsigned(y);
}
void write_string(const std::string &s) {
for (char c : s) {
write_char(c);
}
}
void write_single(int x) { write_signed(x); }
void write_single(unsigned x) { write_unsigned(x); }
void write_single(long x) { write_signed(x); }
void write_single(unsigned long x) { write_unsigned(x); }
void write_single(long long x) { write_signed(x); }
void write_single(unsigned long long x) { write_unsigned(x); }
void write_single(char c) { write_char(c); }
void write_single(const std::string &s) { write_string(s); }
public:
Writer(FILE *fp) : fp(fp), ptr(buf) {}
~Writer() { flush(); }
void flush() {
std::fwrite(buf, 1, ptr - buf, fp);
ptr = buf;
}
void write() {}
template <typename Head, typename... Tail>
void write(Head &&head, Tail &&...tail) {
write_single(head);
if (sizeof...(Tail)) {
write_char(' ');
}
write(std::forward<Tail>(tail)...);
}
template <typename... T>
void writeln(T &&...t) {
write(std::forward<T>(t)...);
write_char('\n');
}
};
Reader rd(stdin);
Writer wr(stdout);
#line 1 "template/fastio.hpp"
#include <cstdio>
#include <cstring>
#include <type_traits>
#include <utility>
// unable to read INT_MIN (int), LLONG_MIN (long long)
class Reader {
FILE *fp;
static constexpr int BUF = 1 << 18;
char buf[BUF];
char *pl, *pr;
void reread() {
int wd = pr - pl;
std::memcpy(buf, pl, wd);
pl = buf;
pr = buf + wd;
pr += std::fread(pr, 1, BUF - wd, fp);
}
char skip() {
char ch = *pl++;
while (ch <= ' ') {
ch = *pl++;
}
return ch;
}
template <typename T>
void read_unsigned(T &x) {
if (pr - pl < 64) {
reread();
}
x = 0;
char ch = skip();
while ('0' <= ch) {
x = 10 * x + (0xf & ch);
ch = *pl++;
}
}
template <typename T>
void read_signed(T &x) {
if (pr - pl < 64) {
reread();
}
x = 0;
bool neg = false;
char ch = skip();
if (ch == '-') {
ch = *pl++;
neg = true;
}
while ('0' <= ch) {
x = 10 * x + (0xf & ch);
ch = *pl++;
}
if (neg) {
x = -x;
}
}
void read_single(int &x) { read_signed(x); }
void read_single(unsigned &x) { read_unsigned(x); }
void read_single(long &x) { read_signed(x); }
void read_single(unsigned long &x) { read_signed(x); }
void read_single(long long &x) { read_signed(x); }
void read_single(unsigned long long &x) { read_unsigned(x); }
public:
Reader(FILE *fp) : fp(fp), pl(buf), pr(buf) { reread(); }
void read() {}
template <typename Head, typename... Tail>
void read(Head &head, Tail &...tail) {
read_single(head);
read(tail...);
}
};
struct NumberToString {
char buf[10000][4];
constexpr NumberToString() : buf() {
for (int i = 0; i < 10000; ++i) {
int n = i;
for (int j = 3; j >= 0; --j) {
buf[i][j] = '0' + n % 10;
n /= 10;
}
}
}
} constexpr number_to_string_precalc;
class Writer {
FILE *fp;
static constexpr int BUF = 1 << 18;
char buf[BUF];
char *ptr;
void write_u32(unsigned x) {
if ((buf + BUF - ptr) < 32) {
flush();
}
static char sml[12];
int t = 8;
while (x >= 10000) {
unsigned n = x % 10000;
x /= 10000;
std::memcpy(sml + t, number_to_string_precalc.buf[n], 4);
t -= 4;
}
if (x >= 1000) {
std::memcpy(ptr, number_to_string_precalc.buf[x], 4);
ptr += 4;
} else if (x >= 100) {
std::memcpy(ptr, number_to_string_precalc.buf[x] + 1, 3);
ptr += 3;
} else if (x >= 10) {
unsigned q = (x * 103) >> 10;
*ptr++ = q | '0';
*ptr++ = (x - 10 * q) | '0';
} else {
*ptr++ = '0' | x;
}
std::memcpy(ptr, sml + (t + 4), 8 - t);
ptr += 8 - t;
}
void write_u64(unsigned long long x) {
if ((buf + BUF - ptr) < 32) {
flush();
}
if (x >= 10000000000000000) {
unsigned long long z = x % 100000000;
x /= 100000000;
unsigned long long y = x % 100000000;
x /= 100000000;
if (x >= 1000) {
std::memcpy(ptr, number_to_string_precalc.buf[x], 4);
ptr += 4;
} else if (x >= 100) {
std::memcpy(ptr, number_to_string_precalc.buf[x] + 1, 3);
ptr += 3;
} else if (x >= 10) {
unsigned q = (x * 103) >> 10;
*ptr++ = q | '0';
*ptr++ = (x - 10 * q) | '0';
} else {
*ptr++ = '0' | x;
}
std::memcpy(ptr, number_to_string_precalc.buf[y / 10000], 4);
std::memcpy(ptr + 4, number_to_string_precalc.buf[y % 10000], 4);
std::memcpy(ptr + 8, number_to_string_precalc.buf[z / 10000], 4);
std::memcpy(ptr + 12, number_to_string_precalc.buf[z % 10000], 4);
ptr += 16;
} else {
static char sml[12];
int t = 8;
while (x >= 10000) {
unsigned long long n = x % 10000;
x /= 10000;
std::memcpy(sml + t, number_to_string_precalc.buf[n], 4);
t -= 4;
}
if (x >= 1000) {
std::memcpy(ptr, number_to_string_precalc.buf[x], 4);
ptr += 4;
} else if (x >= 100) {
std::memcpy(ptr, number_to_string_precalc.buf[x] + 1, 3);
ptr += 3;
} else if (x >= 10) {
unsigned q = (x * 103) >> 10;
*ptr++ = q | '0';
*ptr++ = (x - 10 * q) | '0';
} else {
*ptr++ = '0' | x;
}
std::memcpy(ptr, sml + (t + 4), 8 - t);
ptr += 8 - t;
}
}
void write_char(char c) {
if (ptr == buf + BUF) {
flush();
}
*ptr++ = c;
}
template <typename T>
void write_unsigned(T x) {
if constexpr (std::is_same_v<T, unsigned long long> ||
std::is_same_v<T, unsigned long>) {
write_u64(x);
} else {
write_u32(x);
}
}
template <typename T>
void write_signed(T x) {
std::make_unsigned_t<T> y = x;
if (x < 0) {
write_char('-');
y = -y;
}
write_unsigned(y);
}
void write_string(const std::string &s) {
for (char c : s) {
write_char(c);
}
}
void write_single(int x) { write_signed(x); }
void write_single(unsigned x) { write_unsigned(x); }
void write_single(long x) { write_signed(x); }
void write_single(unsigned long x) { write_unsigned(x); }
void write_single(long long x) { write_signed(x); }
void write_single(unsigned long long x) { write_unsigned(x); }
void write_single(char c) { write_char(c); }
void write_single(const std::string &s) { write_string(s); }
public:
Writer(FILE *fp) : fp(fp), ptr(buf) {}
~Writer() { flush(); }
void flush() {
std::fwrite(buf, 1, ptr - buf, fp);
ptr = buf;
}
void write() {}
template <typename Head, typename... Tail>
void write(Head &&head, Tail &&...tail) {
write_single(head);
if (sizeof...(Tail)) {
write_char(' ');
}
write(std::forward<Tail>(tail)...);
}
template <typename... T>
void writeln(T &&...t) {
write(std::forward<T>(t)...);
write_char('\n');
}
};
Reader rd(stdin);
Writer wr(stdout);