Um_nik

spoj_wrapper_2

Dec 4th, 2021
817
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. bool readToken(FILE* stream, string &s, int maxLen) {
  2.     int c = ' ';
  3.     s = "";
  4.     while(isspace(c)) c = getc(stream);
  5.     if (c == EOF) return false;
  6.     while(!isspace(c) && c != EOF) {
  7.         s.push_back((char)c);
  8.         if ((int)s.length() > maxLen) return false;
  9.         c = getc(stream);
  10.     }
  11.     return true;
  12. }
  13. bool myToULL(string s, uint64_t &x) {
  14.     if (s.empty()) return false;
  15.     if (s == "0") {
  16.         x = 0;
  17.         return true;
  18.     }
  19.     if (s[0] == '0') return false;
  20.     for (char c : s) if (!isdigit(c)) return false;
  21.     if ((int)s.length() > 19) return false;
  22.     uint64_t y = 0;
  23.     for (char c : s) y = y * 10 + (uint64_t)(c - '0');
  24. }
  25. bool readLong(FILE* stream, int64_t &x) {
  26.     string s;
  27.     if (!readToken(stream, s, 20)) return false;
  28.     ll sgn = 1;
  29.     if (s[0] == '-') {
  30.         sgn *= -1;
  31.         s = s.substr(1, (int)s.length() - 1);
  32.     }
  33.     uint64_t y = 0;
  34.     if (!myToULL(s, y)) return false;
  35.     if (y > ((uint64_t)1 << 63)) return false;
  36.     if (y == 0 && sgn == -1) return false;
  37.     if (y == ((uint64_t)1 << 63)) {
  38.         if (sgn == -1) {
  39.             x = 1;
  40.             x <<= 62;
  41.             x *= -1;
  42.             x += x;
  43.             return true;
  44.         } else {
  45.             return false;
  46.         }
  47.     }
  48.     x = sgn * (int64_t)y;
  49.     return true;
  50. }
  51. bool readLong(FILE* stream, int64_t &x, int64_t L, int64_t R) {
  52.     if (!readLong(stream, x)) return false;
  53.     if (x < L || x > R) return false;
  54.     return true;
  55. }
  56. bool readInt(FILE* stream, int &x, int L, int R) {
  57.     int64_t xx = 0;
  58.     if (!readLong(stream, &xx, L, R)) return false;
  59.     x = xx;
  60.     return true;
  61. }
  62. const int JURY = 0;
  63. const int PART = 1;
  64. const int INPUT = 2;
  65. void myAssert(int who, bool f) {
  66.     if (who == JURY || who == INPUT)
  67.         assert(f);
  68.     else
  69.         spoj_assert(f);
  70. }
  71. struct InStream {
  72.     int who;
  73.     FILE* stream;
  74.  
  75.     InStream() : who(-1), stream() {}
  76.     InStream(int _who) : who(_who) {
  77.         if (who == JURY) {
  78.             stream = spoj_p_out;
  79.         } else if (who == PART) {
  80.             stream = spoj_t_out;
  81.         } else if (who == INPUT) {
  82.             stream = spoj_p_in;
  83.         } else assert(false);
  84.     }
  85.  
  86.     int readInt(int L, int R) {
  87.         int x = 0;
  88.         myAssert(who, ::readInt(stream, x, L, R));
  89.         return x;
  90.     }
  91.     int64_t readLong(int64_t L, int64_t R) {
  92.         int64_t x = 0;
  93.         myAssert(who, ::readLong(stream, x, L, R));
  94.         return x;
  95.     }
  96.     string readToken(int maxLen) {
  97.         string s = "";
  98.         myAssert(who, ::readToken(stream, s, maxLen));
  99.         return s;
  100.     }
  101.     void Assert(bool f) {
  102.         myAssert(who, f);
  103.     }
  104. } inf, ouf, ans;
  105.  
  106. void initChecker() {
  107.     spoj_init();
  108.     ans = InStream(JURY);
  109.     ouf = InStream(PART);
  110.     inf = InStream(INPUT);
  111. }
  112.  
RAW Paste Data