tuki2501

fastestIO?

Nov 23rd, 2020
850
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdlib.h>
  2. #include <stdint.h>
  3. #include <unistd.h>
  4. class FastInput {
  5.   public:
  6.     FastInput() {
  7.       m_dataOffset = 0;
  8.       m_dataSize = 0;
  9.       m_v = 0x80000000;
  10.     }
  11.   uint32_t ReadNext() {
  12.     if (m_dataOffset == m_dataSize) {
  13.       int r = read(0, m_buffer, sizeof(m_buffer));
  14.       if (r <= 0) return m_v;
  15.       m_dataOffset = 0;
  16.       m_dataSize = 0;
  17.       int i = 0;
  18.       if (m_buffer[0] < '0') {
  19.         if (m_v != 0x80000000) {
  20.           m_data[m_dataSize++] = m_v;
  21.           m_v = 0x80000000;
  22.         }
  23.         for (;
  24.           (i < r) && (m_buffer[i] < '0'); ++i);
  25.       }
  26.       for (; i < r;) {
  27.         if (m_buffer[i] >= '0') {
  28.           m_v = m_v * 10 + m_buffer[i] - 48;
  29.           ++i;
  30.         } else {
  31.           m_data[m_dataSize++] = m_v;
  32.           m_v = 0x80000000;
  33.           for (i = i + 1;
  34.             (i < r) && (m_buffer[i] < '0'); ++i);
  35.         }
  36.       }
  37.     }
  38.     return m_data[m_dataOffset++];
  39.   }
  40.   public:
  41.     uint8_t m_buffer[32768];
  42.   uint32_t m_data[16384];
  43.   size_t m_dataOffset, m_dataSize;
  44.   uint32_t m_v;
  45. };
  46. class FastOutput {
  47.   public:
  48.     FastOutput() {
  49.       m_dataOffset = 0;
  50.     }~FastOutput() {}
  51.   void Flush() {
  52.     if (m_dataOffset) {
  53.       if (write(1, m_data, m_dataOffset));
  54.       m_dataOffset = 0;
  55.     }
  56.   }
  57.   void PrintUint(uint32_t v, char d) {
  58.     if (m_dataOffset + 11 > sizeof(m_data)) Flush();
  59.     if (v < 100000) {
  60.       if (v < 1000) {
  61.         if (v < 10) {
  62.           m_data[m_dataOffset + 0] = v + 48;
  63.           m_dataOffset += 1;
  64.         } else if (v < 100) {
  65.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  66.           v /= 10;
  67.           m_data[m_dataOffset + 0] = v + 48;
  68.           m_dataOffset += 2;
  69.         } else {
  70.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  71.           v /= 10;
  72.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  73.           v /= 10;
  74.           m_data[m_dataOffset + 0] = v + 48;
  75.           m_dataOffset += 3;
  76.         }
  77.       } else {
  78.         if (v < 10000) {
  79.           m_data[m_dataOffset + 3] = v - v / 10 * 10 + 48;
  80.           v /= 10;
  81.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  82.           v /= 10;
  83.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  84.           v /= 10;
  85.           m_data[m_dataOffset + 0] = v + 48;
  86.           m_dataOffset += 4;
  87.         } else {
  88.           m_data[m_dataOffset + 4] = v - v / 10 * 10 + 48;
  89.           v /= 10;
  90.           m_data[m_dataOffset + 3] = v - v / 10 * 10 + 48;
  91.           v /= 10;
  92.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  93.           v /= 10;
  94.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  95.           v /= 10;
  96.           m_data[m_dataOffset + 0] = v + 48;
  97.           m_dataOffset += 5;
  98.         }
  99.       }
  100.     } else {
  101.       if (v < 100000000) {
  102.         if (v < 1000000) {
  103.           m_data[m_dataOffset + 5] = v - v / 10 * 10 + 48;
  104.           v /= 10;
  105.           m_data[m_dataOffset + 4] = v - v / 10 * 10 + 48;
  106.           v /= 10;
  107.           m_data[m_dataOffset + 3] = v - v / 10 * 10 + 48;
  108.           v /= 10;
  109.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  110.           v /= 10;
  111.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  112.           v /= 10;
  113.           m_data[m_dataOffset + 0] = v + 48;
  114.           m_dataOffset += 6;
  115.         } else if (v < 10000000) {
  116.           m_data[m_dataOffset + 6] = v - v / 10 * 10 + 48;
  117.           v /= 10;
  118.           m_data[m_dataOffset + 5] = v - v / 10 * 10 + 48;
  119.           v /= 10;
  120.           m_data[m_dataOffset + 4] = v - v / 10 * 10 + 48;
  121.           v /= 10;
  122.           m_data[m_dataOffset + 3] = v - v / 10 * 10 + 48;
  123.           v /= 10;
  124.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  125.           v /= 10;
  126.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  127.           v /= 10;
  128.           m_data[m_dataOffset + 0] = v + 48;
  129.           m_dataOffset += 7;
  130.         } else {
  131.           m_data[m_dataOffset + 7] = v - v / 10 * 10 + 48;
  132.           v /= 10;
  133.           m_data[m_dataOffset + 6] = v - v / 10 * 10 + 48;
  134.           v /= 10;
  135.           m_data[m_dataOffset + 5] = v - v / 10 * 10 + 48;
  136.           v /= 10;
  137.           m_data[m_dataOffset + 4] = v - v / 10 * 10 + 48;
  138.           v /= 10;
  139.           m_data[m_dataOffset + 3] = v - v / 10 * 10 + 48;
  140.           v /= 10;
  141.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  142.           v /= 10;
  143.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  144.           v /= 10;
  145.           m_data[m_dataOffset + 0] = v + 48;
  146.           m_dataOffset += 8;
  147.         }
  148.       } else {
  149.         if (v < 1000000000) {
  150.           m_data[m_dataOffset + 8] = v - v / 10 * 10 + 48;
  151.           v /= 10;
  152.           m_data[m_dataOffset + 7] = v - v / 10 * 10 + 48;
  153.           v /= 10;
  154.           m_data[m_dataOffset + 6] = v - v / 10 * 10 + 48;
  155.           v /= 10;
  156.           m_data[m_dataOffset + 5] = v - v / 10 * 10 + 48;
  157.           v /= 10;
  158.           m_data[m_dataOffset + 4] = v - v / 10 * 10 + 48;
  159.           v /= 10;
  160.           m_data[m_dataOffset + 3] = v - v / 10 * 10 + 48;
  161.           v /= 10;
  162.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  163.           v /= 10;
  164.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  165.           v /= 10;
  166.           m_data[m_dataOffset + 0] = v + 48;
  167.           m_dataOffset += 9;
  168.         } else {
  169.           m_data[m_dataOffset + 9] = v - v / 10 * 10 + 48;
  170.           v /= 10;
  171.           m_data[m_dataOffset + 8] = v - v / 10 * 10 + 48;
  172.           v /= 10;
  173.           m_data[m_dataOffset + 7] = v - v / 10 * 10 + 48;
  174.           v /= 10;
  175.           m_data[m_dataOffset + 6] = v - v / 10 * 10 + 48;
  176.           v /= 10;
  177.           m_data[m_dataOffset + 5] = v - v / 10 * 10 + 48;
  178.           v /= 10;
  179.           m_data[m_dataOffset + 4] = v - v / 10 * 10 + 48;
  180.           v /= 10;
  181.           m_data[m_dataOffset + 3] = v - v / 10 * 10 + 48;
  182.           v /= 10;
  183.           m_data[m_dataOffset + 2] = v - v / 10 * 10 + 48;
  184.           v /= 10;
  185.           m_data[m_dataOffset + 1] = v - v / 10 * 10 + 48;
  186.           v /= 10;
  187.           m_data[m_dataOffset + 0] = v + 48;
  188.           m_dataOffset += 10;
  189.         }
  190.       }
  191.     }
  192.     m_data[m_dataOffset++] = d;
  193.   }
  194.   void PrintChar(char d) {
  195.     if (m_dataOffset + 1 > sizeof(m_data)) Flush();
  196.     m_data[m_dataOffset++] = d;
  197.   }
  198.   void ReplaceChar(int offset, char d) {
  199.     m_data[m_dataOffset + offset] = d;
  200.   }
  201.   public:
  202.     uint8_t m_data[32768];
  203.   size_t m_dataOffset;
  204. };
  205. FastInput fi; FastOutput fo;
RAW Paste Data